| 검색 | ?

1.1. 개요



FFmpeg in 100 Seconds
참고 영상

[https]ffmpeg[] 은 여러가지 멀티미디어 포맷을 다루는 광범위한 라이브러리이자 코덱이고 도구입니다. 이를 사용하여 멀티미디어를 다양하게 다룰 수 있습니다. ffmpeg은 미디어 관련 거의 모든 것을 다룰 수 있다고 할 수 있을 정도로 기능이 광범위합니다.

Video/Audio Codec, Subtitle, Encapsulation/Container Format, Meta data, Color/Pixel format/space, Display/Pixel/Input Aspect ratio, I(Intra)[1]/P(Predictive)[2]/B(Bidirectionally predictive)[3] frame, Progressive(순차)[4]/Interlaced(격행)[5] scanning(주사 방식) 등을 이해하시고 차이를 알고 계신다고 가정하고 설명합니다. (우리가 일반적으로 부르는 명칭과 표준 명칭 그리고 관습적인 명칭등이 달라서 각각의 구분이 모호한 경우를 이해할 수 있을 필요가 있다고 생각됩니다.)
  • Video Codec
    • MPEG1 video (ISO/IEC 11172-2)
      • ffmpeg에서 지원하는 codec 명으로는 'mpeg1video', ... 등이 있습니다.
    • MPEG2 video (ISO/IEC 13818-2, H.262)
      • ffmpeg에서 지원하는 codec 명으로는 'mpeg2video', ... 등이 있습니다.
      • 일반 위성/케이블/공중파 방송등에서 많이 사용되는 형식이지만 점점 H.264, H.265 등으로 바뀌어가고 있습니다.
    • MPEG4 video (ISO/IEC 14496-2, ASP)
      • ffmpeg에서 지원하는 codec 명으로는 'mpeg4', ... 등이 있습니다.
    • H.264 video (ISO/IEC 14496-10, AVC)
      • ffmpeg에서 지원하는 codec 명으로는 'h264', 'libx264', 'h264_nvenc', 'h264_qsv', ... 등이 있습니다.
      • 현 시대의 대부분의 컴퓨팅 파워에 알맞은 연산들을 사용하고 있어 많이 선호되는 형식이라고 할 수 있습니다.
    • H.265 video (ISO/IEC 23008-2, HEVC)
      • ffmpeg에서 지원하는 codec 명으로는 'hevc', 'hevc_qsv', 'hevc_cuvid', 'libx265', 'hevc_nvenc', 'hevc_vaapi', ... 등이 있습니다.
      • 압축률이 높은 수준이나 순수 CPU로만 처리하기에는 부하가 높은 연산들을 포함하고 있어 고성능 CPU나 H/W 가속을 요구하는 편입니다.
        • 점점 컴퓨팅 파워가 더 좋아지면서 많이 사용되어지고 있는 형식이라고 할 수 있습니다.
    • WMV1 (Windows Media Video v7), WMV2 (Windows Media Video v8), WMV3 (Windows Media Video v9), WVC1 (Windows Media Video v9), ...
      • ffmpeg에서 지원하는 codec 명으로는 'wmv1', 'wmv2', 'wmv3', ... 등이 있습니다.
      • DMO(DirectX Media Object, COM 기반 데이터 스트리밍 구성 요소) 기반 코덱
        • 마이크로소프트 윈도우 미디어 포맷의 핵심코덱으로 볼 수 있습니다.
    • ...
  • Audio Codec
    • MP3 audio (ISO/IEC 11172-3, ISO/IEC 13818-3, MPEG 1/2 layer I/II/III)
    • AAC (ISO/IEC 13818-7, MPEG2 AAC, Advanced Audio Coding)
      • ffmpeg에서 지원하는 codec 명으로는 'aac', ... 등이 있습니다.
      • MPEG2 Audio 라고도 하지만 일반적으로 AAC 라고 부릅니다.
    • HE AAC (ISO/IEC 14496-3, MPEG4 AAC, High-Efficiency Advanced Audio Coding)
      • MPEG4 Audio 라고도 하지만 일반적으로 AAC 또는 HE AAC 라고 부릅니다.
    • AC3 (Audio Coding-3)
      • ffmpeg에서 지원하는 codec 명으로는 'ac3', 'eac3', ... 등이 있습니다.
      • Dolby Digital 또는 Dolby AC-3는 Dolby 연구소 (Dolby® Laboratories) 가 개발한 손실 오디오 압축 기술에 대한 상표
        • 사용을 위해 라이선스가 필요합니다.
      • 'Psychoacoustic' 이라는 손실 압축 방식을 사용하여 데이터를 압축합니다.
    • DTS
    • FLAC (Free Lossless Audio Codec)
      • ffmpeg에서 지원하는 codec 명으로는 'flac', ... 등이 있습니다.
      • 오디오 데이터 압축을 위한 무손실 압축 포맷의 한 가지이며, [https]Xiph.Org Foundation[] 에서 개발한 코덱입니다.
        • WAV 같은 경우도 무손실 포맷이지만 FLAC이 더 작은 용량을 차지하기 때문에 요즘 많이 사용되고 있습니다. (WAV도 별도 압축 프로그램으로 압축하면 비슷하다는 것)
    • ...
  • Subtitle (자막)
    • 자막은 크게 Text와 Image 형식으로 나뉠 수 있고 Text의 경우는 Charset Encoding (예: UTF, CP949, EUC-KR, ShiftJS, ...) 을 고려하며 Image의 경우 Bitmap과 Vector 형식을 고려합니다.
    • DVB subtitle
      • ffmpeg에서 지원하는 codec 명으로는 'dvb_subtitle', 'dvbsub', ... 등이 있습니다.
    • Teletext
      • ffmpeg에서 지원하는 codec 명으로는 'dvb_teletext', ... 등이 있습니다.
    • Subrip, '.srt'
      • ffmpeg에서 지원하는 codec 명으로는 'subrip', 'srt', ... 등이 있습니다.
    • SAMI(Synchronized Accessible Media Interchange), '.smi'
      • ffmpeg에서 지원하는 codec 명으로는 'sami', ... 등이 있습니다.
    • ...
  • Muxer/Demuxer
    • 하나 이상의 요소인 코덱이나 메타데이터들로 구성된 것을 특정 동기조건등을 포함하여 format으로 묶어주는 것을 muxer라고 하고 반대로 분리해석하는 것을 demuxer 라고 합니다.
      • 즉, 예를 들면 Video와 Audio간의 동기화정보를 포함하여 저장 Format으로 묶어 저장하는 포맷화 작업을 muxer가 해줍니다. 반대로 저장된 파일 포맷을 읽어들여 Video와 Audio를 추출하여 각 Decoder 로 분배해주는 역할을 하는 것이 demuxer 라고 할 수 있습니다.
  • Encapsulation/Container Format (저장용과 스트림용으로 목적이 거의 대부분 명확히 구분되어 각 Codec을 묶어 동기 정보 및 메타 정보등을 담고 있습니다.)
    • MPEG1 system ('.mpg', '.mpeg', '.mp1')
      • ffmpeg에서 지원하는 format 명으로는 'mpeg', 'vcd', ... 등이 있습니다.
      • MPEG1 에서 기술하는 저장용 포맷입니다.
    • MPEG2 Program stream (MPEG2 PS) ('.mpg', '.mpeg', '.mp2', '.ps')
      • ffmpeg에서 지원하는 format 명으로는 'mpeg', 'vob', 'dvd', 'svcd', ... 등이 있습니다.
      • MPEG2 에서 기술하는 저장용 포맷입니다.
      • PES (Program element stream) ('.pes' 을 저장용으로 구성한 포맷입니다.)
    • ES (Elementary stream) ('.es')
      • 개별적인 Video/Audio codec 에 시간동기정보 및 부가적인 Codec을 기술하는 MPEG하위 포맷입니다. MPEG1, MPEG2, MPEG4 등에서 Video및 Audio 에 대한 ES 를 동기정보와 함께 묶어서 Encapsulation됩니다.
    • MPEG Transport Stream (MPEG2 TS, ISO/IEC 13818-1) ('.ts', '.m2t')
      • MPEG2 에서 기술하는 스트림용 포맷입니다. 전송 구간에서 일부 손실이 있어도 어느 정도 내성을 가지고 복구 또는 손실처리를 할 수 있지만 빠른 탐색등에 필요한 Indexing 정보가 없어 탐색에는 불리합니다.
      • 일정 간격마다 반복되는 기술 정보가 포함되고 작은 단위 패킷 (보통 188 bytes, FEC의 경우 204 bytes)으로 분할되어 전송합니다.
      • 일반 케이블, 위성 및 IPTV 실시간 스트림 방송등 대부분의 방송스트림 포맷으로 사용됩니다.
        • 주로 스트림 전송 구간에 손실 가능성이 많은 것을 고려해야 할 경우 사용되는 형식입니다.
      • 참고) MPEG Transport Stream
      • 참고) CAS (Conditional Access System)
      • 참고) Positive 및 Negative Filter (MPEG TS Section Filter)
      • 참고) DSM-CC (Digital Storage Media Command and Control)
    • MP4 (ISO/IEC 14496-12, ISO/IEC 14496-14, ISO/IEC 14496-24, ISO Base Media File Format) ('.mp4')
      • ffmpeg에서 지원하는 format 명으로는 'mp4', 'ipod', 'psp', ... 등이 있습니다.
      • Atom header 등을 이용해서 구조화된 저장용 포맷입니다.
    • MKV (Matroska Multimedia Container) ('.mkv')
      • ffmpeg에서 지원하는 format 명으로는 'matroska', ... 등이 있습니다.
      • 공개용 저장포맷 중에 하나입니다.
    • RIFF AVI (DivX), OpenDML AVI File Extensions, ... ('.avi', '.divx')
    • ADIF (Audio Data Interchange Format) ('.adif')
      • 저장용 Audio 포맷입니다.
    • ADTS (Audio Data Transport Stream) ('.adts')
      • ffmpeg에서 지원하는 format 명으로는 'adts', ... 등이 있습니다.
      • 스트림용 Audio 포맷입니다.
    • ASF (Advanced Systems Format) ('.asf', '.wmv', '.wma')
    • ...
  • Color format/space (pixel format)
    • RGB (Red/Green/Blue)
      • 빨강, 초록, 파랑 3가지 색상 정보로 나타내는 색 표현방식입니다.
        • 물감으로 이 3원색을 많이 섞을수록 어두워지는 반면 우리의 모니터는 이러한 3원색을 많이 섞을 수록 밝아집니다. 그래서 우리가 다루는 색상정보는 물감이 아닌 빛의 3원색 특성을 갖습니다.
      • 부가적으로 Alpha (투명도) 와 ChromaKey (색 분리 필터) 를 포함하여 사용하기도 합니다.
        • Chromakey : 특정 색상조건을 다른 영상으로 대체하는 것을 의미한다고 보시면 됩니다.
          • 예를 들면 A영상의 파란색을 Chromkey color 로 지정하고 B영상을 이 Chromakey에 섞도록 할 수 있습니다. (뉴스에 보시면 아나운서가 파란화면 또는 초록화면등의 배경에서 일기예보를 하면 실제 출력 영상에는 그 색상부분에 지도가 보여지는 것이 대표적인 예입니다.)
        • Alpha : 어떤 영상 2개 A와 B가 있고 A가 전면에 있고 B가 후면에 있을 때 A의 Alpha농도에 따라서 A영상이 투명해지고 그 후면에 있는 B영상이 투명도에 따라서 보여지는 것을 의미한다고 보시면 됩니다. (실제 구현은 Alpha level 값을 비율로 하여 그 비율만큼 A와 B의 색상을 섞는 형태로써 구현될 수 있을겁니다.)
          • 예를 들면 방송에서 화면전환시 이전 화면과 다음 화면이 교차되면서 넘어가는 것이 대표적인 예입니다.
      • 각 색상의 단계(bits)를 세분화 할 수록 색 표현력이 증가합니다. (예: 그라데이션 특성을 갖는 하늘색에서 색 단계의 변화에 경계가 이러한 단계 세분화에 따라서 품질 차이가 있습니다.)
      • ffmpeg에서 지원하는 pixel format 명으로는 'rgb0', 'bgr0', 'rgb24', ... 등이 있습니다.
    • Yuv (Y/Cb/Cr)
      • 빛의 세기와 색차신호 정보로 나타내는 색 표현방식입니다.
      • 보통 Cb/Cr 은 그 값의 변화 차이가 사람의 시각적인 인지에는 차이를 못 느끼는 특성이 있어서 영상 압축에 많이 사용되는 표현방식입니다.
        • 색차 신호 단계를 bits로 표현시 그 bits단계를 낮추면 그만큼 압축 효과를 보인다는 것
      • MPEG에서는 4:4:4, 4:2:2, 4:2:0, 4:0:2 등의 비율을 많이 사용합니다.
        • ffmpeg에서 지원하는 pixel format 명으로는 'yuv444p', 'yuv422p', 'yuv420p', ... 등이 있습니다.
    • 주) YCbCr <-> RGB 비율상수공식 : RGB와 Yuv간 변환은 실제로는 디스플레이 특성에 따라서 크게 달라질 수 있으나 보편적인 비율 관계는 다음과 같습니다.
      1 = kb + kr + kg
      kr = 0.299
      kg = 0.587
      kb = 0.114
      
      Y = krR + (1 - kb - kr)G + kbB
      Cb = 0.5(B - Y)/(1 - kb)
      Cr = 0.5(R - Y)/(1 - kr)
      
      R = Y + (1 - kr)Cr/0.5
      G = Y - 2kb(1 - kb)Cb/(1 - kb - kr) - 2kr(1 - kr)Cr/(1 - kb - kr)
      B = Y + (1 - kb)Cb/0.5
      
      => YCbCr <-> RGB 간의 kb,kr,kg 비율상수 적용후 정리된 공식 (여기서 비율 상수가 디스플레이의 특성에 따라서 조정될 수 있습니다.)
      
      Y = 0.299R + 0.587G + 0.114B
      Cb = 0.564(B - Y)
      Cr = 0.713(R - Y)
      
      R = Y + 1.402Cr
      G = Y - 0.344Cb - 0.714Cr
      B = Y + 1.772Cb
      
    • ...
  • 영상을 기술하는 Aspect ratio (비율)
    • Display aspect ratio (화면 비율)
      • 화면 크기 비율
        • 일반적으로 이야기하는 16:9, 4:3, ... 등을 이야기 할 때 말하는 실제 보여지는 화면의 비를 의미합니다.
        • 보통 이것은 물리적인 모니터 또는 스크린의 가로x세로 길이의 비율로 이해할 수 있습니다.
      • 해상도 비율
        • '화면 크기 비율' 이 동일한 16:9 라고 하여도 해상도는 다를 수 있습니다. 가로x세로 픽셀 수의 비율로 나타냅니다.
    • Pixel aspect ratio (픽셀 비율)
      • 정해진 '화면 크기'의 비율과 다른 '해상도'를 임의로 설정하고 화면에 꽉차게 나오게 한다면 하나의 픽셀을 확대해서 보면 찌그러져 보일 수 있습니다. 이러한 하나의 픽셀에 대하여 보여지는 비율로 나타냅니다.
    • 그 밖에도 픽셀과 픽셀 간의 여백도 가로와 세로간 간격이 다를 수 있습니다.
    • 간혹 보시면 16:9(비율 또는 해상도) 영상이라고 만들었는데 16:9 모니터에서 보면 여백 없이 보여야 하지만 그렇지 않은 경우(레터박스, 상/하 여백, 좌우 여백 등)를 보신 경험 있으실 겁니다. 영상을 제작 또는 변환할 때 이러한 여러가지 비율을 고려하지 않으면 발생되는 현상으로 이해하시면 되겠습니다.
      • 보통은 '픽셀 비율'을 1:1 로 놓고 16:9 영상을 만들면 '해상도 비율'도 16:9 가 될겁니다. 그런데 이것을 16:9 '화면 크기' 비율인 모니터의 해당도를 '해상도 비율' 4:3 인 1024 x 768 픽셀로 설정하고 영상을 재생하면 어떻게 비율을 보정해서 보여줄까요? 이것을 이해하시면 되겠습니다.
      • 제작된 영상과 비율이 맞지 않는 것을 맞추는 방법은 여러가지가 있습니다.
        1. '영상 비율' 을 '해상도 비율'로 스케일해서 맞추는 방법 (이 경우 화면이 항상 꽉 차게 보이겠지만 찌그러져 보일 수 있다는 점)
        2. '영상 비율' 의 가로 또는 세로중에서 '해당도 비율'에 작은쪽 또는 큰 쪽을 맞추고 비율을 유지하여 확대 또는 축소하는 방법 (확대 시에는 일부 면이 잘려보일 수 있고 축소 시에는 레터박스 등의 무의미한 색상으로 채운 공간을 보여주는 방법이 있겠습니다. 대부분은 이 방법을 많이 사용합니다.)
    • 영상을 제작 또는 녹화/캡쳐/인코딩 하실 때 원본의 비율을 알고 샘플링 비율 (sample aspect ratio) 을 잘 설정하시면 문제 없는 영상을 만드실 수 있습니다.
      • 생각해볼 문제) 원본 영상의 해상도가 1920x1080 (해상도 비율 16:9, 픽셀 비율 1:1) 인데 이것을 샘플링 해상도 1024x768 (해상도 비율 4:3)로 변환할 때 픽셀 비율은 무엇이 되어야 할까요?
  • Audio channel
    • mono (1 channel)
      • 오디오를 하나의 채널로 표현
    • stereo (2 channels)
      • 오디오 좌/우를 나누어 각각 저장하는 채널 표현 방식
    • joint stereo (2 channels)
      • 좌/우의 차이를 저장하는 채널 표현 방식
    • 5 channels
      • 전/후/좌/우/센터 (왼쪽, 오른쪽, 가운데, 왼쪽 서라운드, 오른쪽 서라운드)를 나누어 각각 저장하는 채널 표현 방식 (입체 음향을 위한 채널)
    • ...
  • Streamming protocol
    • RTSP(Real time streaming protocol) : 통상 554번 포트를 사용하는 Text(XML고려) 기반의 상호 대화형식의 프로토콜
    • RTP (Realtime transport protocol) : RTSP에 의해서 상호 대화에 의해서 수집된 정보 또는 다른방법으로 수집된 정보를 기반으로 실제 Data를 전송하는 채널로 TCP, UDP(Unicast, Multicast) 등의 전송형식을 갖는 전송로입니다. 포트는 RTSP상호 대화에서 결정되기도 하고 이미 약속한 예약포트를 사용하기도 합니다.
    • RTCP : RTSP/RTP 보조
    • RMCP(Relayed Multicast Control Protocol) : 기존의 Multicast망구성을 개선하여 효율적인 전송을위해서 계층적으로 분산하는 프로토콜로 상당히 필요성이 높아져 가고 있습니다.
    • ISMA : RTSP와 비스므레하면서도 좀더 확장된 개념으로 볼만한 잘 짜여진 구조. '[https]SDP: Session Description Protocol[]' 형식 사용.
    • MMS(t)
      • MMST 에서 오프셋 4의 2바이트의 용도가 비밀에 가려져 있음. MediaPlayer 만이 이 값에 따라서 재생 못하는 현상을 보임.
      • PreRoll time 에 의한 초기 진입 시간 제약 존재
    • ...
  • metadata : 여러가지 부가적인 정보를 의미함
    • ...

1.2. 미디어 압축 특성에 대한 개략적인 설명

  • 핵심은 변화량(시간, 공간, 색)을 어떻게 예측하여 저장할 크기를 줄이는가를 고민하는 것이라고 할 수 있습니다.
    • 압축은 압축된 결과를 다시 풀었을 때 원본으로 복원되는지에 따라서 손실성 압축과 비손실성 압축이 있으며 인간의 시각/청각/촉각은 어느정도의 손실성 압축에도 민감하지 않다는 것을 통해서 압축효과를 극대화 할 수 있습니다.
      • 연속성이 있는 아날로그 정보로 구성된 우리 세계를 디지털로 변환 시부터 이미 손실은 존재한다고 볼 수 있습니다.
        • 영상의 경우 연속적인 색상의 변화 분포를 픽셀단위 격자 형태의 사각 영역으로 변환하므로 해상도가 높을수록 이러한 손실이 적어질 것입니다.
        • 소리의 경우 주파수 및 파형정보로 변환하면서 디지털화되므로 높은 샘플링 주파수일수록 음질의 손실이 적어질 것입니다.
      • 화질이 좋다는 것은 이러한 손실이 적은 것을 의미하겠습니다.
  • 2차원 이미지 압축 알고리즘 특징
    • 영상은 색상정보를 가진 점들의 집합이 2차원 평면상에 구성됩니다.
    • 2차원 상의 특정 점을 기준으로 인접한 점들은 대부분 색상 차이가 크지 않거나 특정 반지름에 해당하는 거리를 원으로 하면 원의 둘레 색상와 중심점 사이의 색상의 변화가 어느정도 예측될 수 있는 특성을 갖습니다.
      • 반지름이 작을 수록 예상 적중확률이 높아지고 반지름이 커질 수록 예상 적중 확률은 떨어진다는 점
      • 색의 변화가 큰 경계영역도 크게 확대해보면 (반지름이 작아지면) 변화가 보입니다.
      • 3차원 영상은 중심점을 기준으로하는 반지름의 구 형태로 확장해서 생각할 수 있습니다.
    • pixel format중 YCbCr의 경우 인간의 시각인지는 Y의 변화를 쉽게 인지하지만 Cb/Cr의 변화에는 인지가 떨어지는 효과를 이용하여 Y:Cb:Cr비율을 달리 배분할 수 있습니다.
    • 원색간의 색상 혼합비율 및 그 색상의 단계를 얼마나 세분화하는냐에 따라서 손실정보가 차이가 발생됩니다.
  • 동영상은 2차원 이미지를 시간에 따른 변화로 표현하는 것
    • 시간의 변화에 있어서 시간의 차이가 작을 때 2차원 평면 이미지의 변화는 매우 작아질 수 있습니다. 이러한 변화된 부분만 저장하는 것으로 크기를 줄일 수 있습니다. (I/B/P frame)
    • 영상의 시간의 변화는 곧 Frame rate 가 높을수록 그 손실이 줄어듭니다.
  • 소리는 시간의 변화에 따라서 그 파장의 높이(주파수, AM 또는 FM)가 변화하는 과정이라고 할 수 있습니다.
    • 시간의 변화에 있어서 시간의 차이가 작을 때 그 높이의 차이는 크지 않는 특성이 있습니다. 그 차이만 저장한다면 크기를 줄일 수 있습니다.
    • 소리 파형을 보면 곡선의 형태로 특정 샘플링 주파수에 따라서 변화하는 곡선의 기울기를 관점으로 저장할 수 있습니다. 시간에 따른 기울기를 수학적으로 풀면 (미/적분) 주요 굴곡 포인트를 베지어 곡선과 같이 재현할 수 있으며 이를 통해서 크기를 줄일 수 있습니다.

1.3. ffmpeg 옵션 별 설명 및 예시

1.3.1. ffmpeg 설치

  • Ubuntu Linux 배포판인 경우
    $ sudo apt-get install ffmpeg
    
  • Windows 의 경우

1.3.2. ffmpeg 기본 사용정보

  • 기본적인 ffmpeg 에 대한 사용법은 다음과 같이 '--help' 옵션으로 실행하면 표시됩니다. (ffmpeg 버젼 및 라이선스, 그리고 빌드 옵션에 따라서 환경에 따른 사용법이 다를 수 있습니다.)
    $ ffmpeg --help
    
    => 좀더 자세한 기본 옵션을 보려면
    $ ffmpeg --help full
    
    • 이 옵션으로 확인해보시면 충분히 전체 옵션들을 어떻게 찾을 수 있는지는 충분히 이해 가능하게 표시됩니다. 다만 용어들에 대한 기본 이해가 필요하다고 생각됩니다.
  • ffmpeg 의 버젼은 '-version' 옵션으로 실행하면 표시됩니다.
    $ ffmpeg -version
    
  • ffmpeg 의 빌드가 어떻게 구성되었는지는 '-buildconf' 옵션으로 실행하면 표시됩니다.
    $ ffmpeg -buildconf
    
  • 기본적인 ffmpeg 의 옵션 순서
    $ ffmpeg [<기타옵션>] [<입력 옵션>] [<코덱 옵션>] [<출력 옵션>]
    
    • ffmpeg 은 굉장히 많은 옵션을 제공합니다. 때문에 주 기능의 하위 옵션들이 동일한 옵션으로 중복되어 다른 기능을 하는 옵션들도 존재합니다. 때문에 고유한 옵션은 무관할 수 있으나 대부분은 옵션의 순서가 어디에 위치하는가에 따라서 어떤 주 기능의 하위 옵션인지 반응할 수 있습니다. 즉, 옵션의 순서는 중요하다는 점!
    • 일반적인 Encoder/Transcoder 로 사용법은 다음과 같습니다.
      $ ffmpeg [<기타옵션>] [[<입력 옵션>] -i <입력소스 또는 입력파일>]... {[<출력 파일> <출력 관련 옵션들>] <출력 파일>}...
      
  • 미디어 파일의 포맷과 코덱 및 메타 정보등을 확인하는 명령 'ffprobe'
    $ ffprobe <미디어 파일명>
    
    • 전문적으로 사용하기 위해서 Video/Audio/Subtitle/Meta 정보등을 확인하고 map 관계를 파악하는데 사용합니다.
  • 간단히 재생해볼 수 있는 명령 'ffplay'
    $ ffplay <미디어 파일명>
    

1.3.3. ffmpeg 에서 지원하는 기능들과 그에 따르는 옵션들 확인

  • 지원하는 format들을 확인하려면 다음과 같이 '-formats' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -formats
    
  • 지원하는 muxer들을 확인하려면 다음과 같이 '-muxers' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -muxers
    
    • muxer 별로 세부 지원 옵션이 다르기 때문에 이를 확인하려면 '-h muxer=<muxer>' 옵션을 실행하면 자세히 표시됩니다.
      $ ffmpeg -h muxer=<muxer>
      
      예) ffmpeg -h muxer=mp4
      
  • 지원하는 demuxer들을 확인하려면 다음과 같이 '-demuxers' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -demuxers
    
    • demuxer 별로 세부 지원 옵션이 다르기 때문에 이를 확인하려면 '-h demuxer=<demuxer>' 옵션을 실행하면 자세히 표시됩니다.
      $ ffmpeg -h demuxer=<demuxer>
      
      예) ffmpeg -h demuxer=mp4
      
  • 지원하는 device들을 확인하려면 다음과 같이 '-devices' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -devices
    
  • 지원하는 codec들을 확인하려면 다음과 같이 '-codecs' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -codecs
    
  • 지원하는 decoder들을 확인하려면 다음과 같이 '-decoders' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -decoders
    
    • decoder 별로 세부 지원 옵션이 다르기 때문에 이를 확인하려면 '-h decoder=<decoder>' 옵션을 실행하면 자세히 표시됩니다.
      $ ffmpeg -h decoder=<decoder>
      
      예) ffmpeg -h decoder=h264
      
  • 지원하는 encoder들을 확인하려면 다음과 같이 '-encoders' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -encoders
    
    • encoder 별로 세부 지원 옵션이 다르기 때문에 이를 확인하려면 '-h encoder=<encoder>' 옵션을 실행하면 자세히 표시됩니다.
      $ ffmpeg -h encoder=<encoder>
      
      예) ffmpeg -h encoder=h264
      예) ffmpeg -h encoder=libx264
      예) ffmpeg -h encoder=h264_nvenc
      예) ffmpeg -h encoder=h264_omx
      예) ffmpeg -h encoder=h264_v4l2m2m
      
  • 지원하는 bit stream filter들을 확인하려면 다음과 같이 '-bsfs' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -bsfs
    
    • bit stream filter 별로 세부 지원 옵션이 다르기 때문에 이를 확인하려면 '-h bsf=<bit stream filter>' 옵션을 실행하면 자세히 표시됩니다.
      $ ffmpeg -h bsf=<bit stream filter>
      
      예) ffmpeg -h bsf=h264_metadata
      
  • 지원하는 protocol들을 확인하려면 다음과 같이 '-protocols' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -protocols
    
    • protocol 별로 세부 지원 옵션이 다르기 때문에 이를 확인하려면 '-h protocol=<protocol>' 옵션을 실행하면 자세히 표시됩니다.
      $ ffmpeg -h protocol=<protocol>
      
      예) ffmpeg -h protocol=bluray
      
  • 지원하는 filter들을 확인하려면 다음과 같이 '-filters' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -filters
    
    • filter 별로 세부 지원 옵션이 다르기 때문에 이를 확인하려면 '-h filter=<filter>' 옵션을 실행하면 자세히 표시됩니다.
      $ ffmpeg -h filter=<filter>
      
      예) ffmpeg -h filter=chromakey
      
  • 지원하는 pixel format들을 확인하려면 다음과 같이 '-pix_fmts' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -pix_fmts
    
  • 지원하는 standard channel layout들을 확인하려면 다음과 같이 '-layouts' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -layouts
    
  • 지원하는 audio sample format들을 확인하려면 다음과 같이 '-sample_fmts' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -sample_fmts
    
  • 지원하는 color name들을 확인하려면 다음과 같이 '-colors' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -colors
    
  • 지원하는 장치의 입력으로 사용할 수 있는 것을 확인하려면 '-sources <device>' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -sources <device>
    
  • 지원하는 장치의 출력으로 사용할 수 있는 것을 확인하려면 '-sinks <device>' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -sinks <device>
    
  • 지원하는 H/W 가속 요소를 확인하려면 '-hwaccels' 옵션으로 실행하면 자세히 표시됩니다.
    $ ffmpeg -hwaccels
    

1.4. 사용 예시

  • Transcoding - Format:MP4, Video:H.264, Audio:AAC, Subtitle:mov_text
    => NVENC, nVidia의 H/W Encoder 가속을 사용하여 변환 (제품에 따라서 주어질 수 있는 지원 옵션들이 다를 수 있음)
    $ ffmpeg -stats -hwaccel auto -i "<변환하고자 하는 입력 파일>" -threads "0" -vsync "vfr" -c:v "h264_nvenc" -preset p7 -tune hq -rc:v vbr -rc-lookahead 8 -cq:v 26 -b:v 0 -bufsize:v 240M -maxrate:v 128M -profile:v high -level:v auto -pix_fmt yuv420p -c:a "aac" -ab "192k" -ac "2" -c:s "mov_text" -f "mp4" -max_muxing_queue_size 1024 "<변환하여 저장할 파일명>.mp4"
    
    => libx264 S/W Encoder 를 사용하여 변환 (고화질 변환, 참고로 영상 퀄리티는 꽤 유지하지만 굉장히 느림)
    $ ffmpeg -stats -hwaccel auto -i "<변환하고자 하는 입력 파일>" -threads "0" -vsync "vfr" -c:v "libx264" -preset veryslow -rc-lookahead 8 -crf:v 26 -b:v 0 -bufsize:v 240M -maxrate:v 128M -profile:v high -pix_fmt yuv420p -c:a "aac" -ab "192k" -ac "2" -c:s "copy" -f "mp4" -max_muxing_queue_size 1024 -map 0 "<변환하여 저장할 파일명>.mp4"
    
    => h264 S/W Encoder 를 사용하여 변환
    $ ffmpeg -stats -hwaccel auto -i "<변환하고자 하는 입력 파일>" -threads "0" -vsync "vfr" -c:v "h264" -preset veryslow -b:v 0 -profile:v high -pix_fmt yuv420p -c:a "aac" -ab "192k" -ac "2" -c:s "copy" -f "mp4" -max_muxing_queue_size 1024 -map 0 "<변환하여 저장할 파일명>.mp4"
    
  • Convert format - Format:MP4, Video:copy, Audio:copy, Subtitle:copy (모든 코덱은 그대로 유지한 채 파일 포맷만 변경)
    $ ffmpeg -stats -hwaccel auto -i "<변환하고자 하는 입력 파일>" -threads "0" -vsync "vfr" -c:v "copy" -c:a "copy" -c:s "mov_text" -f "mp4" -max_muxing_queue_size 1024 -map 0 "<변환하여 저장할 파일명>.mp4"
    
  • Muxing subtitle - Format:MP4, Video:COPY, Audio:COPY, Subtitle:mov_text
    $ ffmpeg -hide_banner -stats -hwaccel auto -i "<입력 동영상 파일>" -i "<입력 자막 파일(srt 형식)>" -threads "0" -c:v "copy" -c:a "copy" -map_metadata -1 -map 0:v:0 -map 0:a:1 -map 1 -c:s:0 mov_text -metadata:s:s:0 "title=자막이름" -metadata:s:s:0 "language=kor" -f "mp4" -max_muxing_queue_size 1024 "<변환하여 저장할 파일명>.mp4"
    
  • 배포판마다 다를 수 있으나 보통은 render group 퍼미션이 주어진 계정에서 HW 가속을 사용할 수 있습니다. (예: Quick Sync Video)
  • nVidia 그래픽카드를 사용한 H/W 가속을 사용하려면 CUDA SDK등을 설치해야 할 수 있습니다.

----
  • [1] I (Intra picture) : 하나의 완전한 화면을 구성할수 있는 화면으로 바로 밑에 오는 P와 B화면을 구성하는데 참조적인 역할을 수행하는 기준입니다.
  • [2] P (Predictive picture) : 가장 최근의 I 또는 P 화면으로부터 움직임의 차이부분만을 압축한 화면입니다. 당연히 P화면만으로는 전체화면을 갱신할수 없으며 적어도 I 화면이 한개 이상 있어야 한다는 예상을 할수 있으며 움직임이 있는 영역만을 압축하므로 I 화면보다 작다는 것도 예상할수 있습니다. 여기서 중요한 점은 P 화면은 시간선상에서 과거의 화면으로부터 차이점만을 압축하는 순방향 예측만을 적용합니다.
  • [3] B (Bidirectionally predictive picture) : P와 비슷하게 인접한 I또는 P 또는 B로부터의 차이를 압축한 화면입니다. P와 다른점은 시간선상에서 과거 및 미래 두가지 모두 예측하는 것이 차이점이라 할수 있습니다.
  • [4] 순차주사(Progressive scanning) : 주사선을 왼쪽에서 오른쪽으로 위에서 아래로 순차적으로 발생시키는 방식
  • [5] 격행주사(Interlaced scanning) : 왼쪽에서 오른쪽으로 위에서 아래로 순차적으로 발생하지만 위에서 아래로의 주사선은 2배의 간격으로 1/2만큼의 주사선을 격자로 각각 발생시키는 방식


Copyright ⓒ MINZKN.COM
All Rights Reserved.