111 FFmpeg 라이브러리 코덱과 영상 변환을 중심으로 이기곤 지음
111 FFmpeg 라이브러리 코덱과영상변환을중심으로 이기곤지음
표지사진유형진이책의표지는유형진님이보내주신풍경사진을담았습니다. 리얼타임은독자의시선을담은풍경사진을책표지로보여주고자합니다. 사진보내기 ebookwriter@hanbit.co.kr FFmpeg 라이브러리코덱과영상변환을중심으로 초판발행 2015 년 8 월 13 일 지은이이기곤 / 펴낸이김태헌펴낸곳한빛미디어 ( 주 ) / 주소서울시마포구양화로 7길 83 한빛미디어 ( 주 ) IT출판부전화 02-325-5544 / 팩스 02-336-7124 등록 1999년 6월 24일제10-1779호 ISBN 978-89-6848-772-9 15000 / 정가 9,900원 총괄배용석 / 책임편집김창수 / 기획 편집정지연 / 교정이미연디자인표지 / 내지여동일, 조판최송실마케팅박상용 / 영업김형진, 김진불, 조유미 이책에대한의견이나오탈자및잘못된내용에대한수정정보는한빛미디어 ( 주 ) 의홈페이지나아래이메일로알려주십시오. 한빛미디어홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr Published by HANBIT Media, Inc. Printed in Korea Copyright c 2015 이기곤 & HANBIT Media, Inc. 이책의저작권은이기곤과한빛미디어 ( 주 ) 에있습니다. 저작권법에의해보호를받는저작물이므로무단복제및무단전재를금합니다. 지금하지않으면할수없는일이있습니다. 책으로펴내고싶은아이디어나원고를메일 (ebookwriter@hanbit.co.kr) 로보내주세요. 한빛미디어 ( 주 ) 는여러분의소중한경험과지식을기다리고있습니다.
저자소개 지은이 _ 이기곤 아이렌소프트 (AirenSoft) 에서풀스택 (full-stack) 개발자로일하고있다. Github (https://github.com/sorrowhill) 을운영하고있으며멀티미디어와관련된라이브러리를주로다룬다. 사용하는언어로는 C/C++ 를가장선호하며현재는대부분의시간을 Rust와함께보내고있다.
저자서문 FFmpeg은멀티미디어분야에서가장많이사용되는오픈소스프로젝트입니다. 멀티미디어는매우방대하고쉽게접근하기어려운분야지만, 멀티미디어를쉽게다룰수있도록 FFmpeg은영상의변환, 재생, 스트리밍등의강력한기능을제공합니다. 그런데현재 FFmpeg 라이브러리를자세하게다루는문서는거의없다시피합니다. 인터넷에게재된소스코드들도너무오래되어최신라이브러리에적용하기에는문제가많으며이해하기도힘듭니다. 모든멀티미디어지식을이책에담지는못하지만, FFmpeg을사용하면서겪었던경험을되살려반드시알아야만하는요소위주로정리하였습니다. 이책에서소개하는내용이잘이해되지않는다고해서 FFmpeg을사용하지못하는것은아닙니다. 오히려 FFmpeg을사용하면서이해가되는경우가더많기때문에책을보며이해가되지않는부분은가볍게넘어가셔도괜찮습니다. 이책이나오기까지많은분의도움이있었습니다. 늦은원고마감에도출판을위해힘써주신한빛미디어관계자분들께감사의말씀을드립니다. 많은조언과응원을주신부모님, 친구, 동료들께도감사드립니다.
대상독자및참고사항 초급초중급중급중고급고급 이책은리눅스기반의개발환경에서 FFmpeg 라이브러리를사용하거나사용하려는독자를대상으로합니다. 따라서 C 언어를깊게이해하고있어야하며 GNU Make 와 GNU GCC에대한전반적인이해가필요합니다. 또한, 이책에서는안드로이드 NDK와관련된내용은다루지않습니다. 이책을쓰는시점에서사용한 FFmpeg 버전은 2.7.1이며메이저버전이낮거나높은 FFmpeg 버전에서는일부코드가동작하지않을수있습니다. 이책에서사용한코드는 Github (https://github.com/sorrowhill) 에서다운로드할수있습니다.
한빛리얼타임 한빛리얼타임은 IT 개발자를위한 ebook 입니다. 요즘 IT 업계에는하루가멀다하고수많은기술이나타나고사라져갑니다. 인 터넷을아무리뒤져도조금이나마정리된정보를찾기도쉽지않습니다. 또한, 잘정리되어책으로나오기까지는오랜시간이걸립니다. 어떻게하면조금이라 도더유용한정보를빠르게얻을수있을까요? 어떻게하면남보다조금더빨 리경험하고습득한지식을공유하고발전시켜나갈수있을까요? 세상에는수 많은종이책이있습니다. 그리고그종이책을그대로옮긴전자책도많습니다. 전자책에는전자책에적합한콘텐츠와전자책의특성을살린형식이있다고생 각합니다. 한빛이지금생각하고추구하는, 개발자를위한리얼타임전자책은이렇습니다. 1 ebook First - 빠르게변화하는 IT 기술에대해핵심적인정보를신속하게제공합니다 500페이지가까운분량의잘정리된도서 ( 종이책 ) 가아니라, 핵심적인내용을빠르게전달하기위해조금은거칠지만 100페이지내외의전자책전용으로개발한서비스입니다. 독자에게는새로운정보를빨리얻을기회가되고, 자신이먼저경험한지식과정보를책으로펴내고싶지만너무바빠서엄두를못내는선배, 전문가, 고수분에게는좀더쉽게집필할수있는기회가될수있으리라생각합니다. 또한, 새로운정보와지식을빠르게전달하기위해 O'Reilly의전자책번역서비스도하고있습니다. 2 무료로업데이트되는전자책전용서비스입니다 종이책으로는기술의변화속도를따라잡기가쉽지않습니다. 책이일정분량이상으 로집필되고정리되어나오는동안기술은이미변해있습니다. 전자책으로출간된이 후에도버전업을통해중요한기술적변화가있거나저자 ( 역자 ) 와독자가소통하면서보완하여발전된노하우가정리되면구매하신분께무료로업데이트해드립니다.
3 4 독자의편의를위해 DRM-Free 로제공합니다 구매한전자책을다양한 IT 기기에서자유롭게활용할수있도록 DRM-Free PDF 포맷으로제공합니다. 이는독자여러분과한빛이생각하고추구하는전자책을만들어나가기위해독자여러분이언제어디서어떤기기를사용하더라도편리하게전자책을볼수있도록하기위함입니다. 전자책환경을고려한최적의형태와디자인에담고자노력했습니다종이책을그대로옮겨놓아가독성이떨어지고읽기어려운전자책이아니라, 전자책의환경에가능한한최적화하여쾌적한경험을드리고자합니다. 링크등의기능을적극적으로이용할수있음은물론이고글자크기나행간, 여백등을전자책에가장최적화된형태로새롭게디자인하였습니다. 앞으로도독자여러분의충고에귀기울이며지속해서발전시켜나가도록하겠 습니다. 지금보시는전자책에소유권한을표시한문구가없거나타인의소유권한을표시한문구가있다면위법하게사용하고있을가능성이큽니다. 이경우저작권법에따라불이익을받으실수있습니다. 다양한기기에사용할수있습니다. 또한, 한빛미디어사이트에서구매하신후에는횟수에관계없이내려받으실수있습니다. 한빛미디어전자책은인쇄, 검색, 복사하여붙이기가가능합니다. 전자책은오탈자교정이나내용의수정 보완이이뤄지면업데이트관련공지를이메일로알려드리며, 구매하신전자책의수정본은무료로내려받으실수있습니다. 이런특별한권한은한빛미디어사이트에서구매하신독자에게만제공되며, 다른사람에게양도나이전은허락되지않습니다.
차례 Part 1 동영상에대한이해 001 chapter 1 동영상의구성 003 1.1 컨테이너 003 1.2 코덱 004 1.3 픽셀 006 1.4 해상도 007 1.5 프레임레이트와화면주사방식 010 1.6 크로마서브샘플링 014 1.7 비디오압축 016 1.8 오디오샘플링 018 1.9 비트레이트 020 chapter 2 컨테이너와코덱 023 2.1 동영상컨테이너 023 2.2 비디오코덱 029 2.3 오디오코덱 032 2.4 4K 해상도와차세대코덱이야기 034
Part 2 FFmpeg 라이브러리활용 039 chapter 3 FFmpeg 살펴보기 041 3.1 개발환경구성 041 3.2 FFmpeg CLI 사용법 045 3.2.1 ffmpeg 045 3.2.2 ffprobe 046 3.3 FFmpeg 구조 047 chapter 4 멀티플렉싱 049 4.1 동영상스캔 049 4.2 디먹싱 051 4.3 리먹싱 053 chapter 5 디코딩과인코딩 057 5.1 디코딩 057 5.2 필터링 060 5.3 인코딩 063 부록 A.1 소스코드 067 A.2 FFmpeg 컴파일옵션 106
Part 1 동영상에대한이해 FFmpeg 라이브러리는멀티미디어를쉽게다룰수있게도와주는도구입니다. 하지만 FFmpeg 라이브러리는다양한동영상규격을통합하여동일한인터페이스로사용할수있게도와줄뿐동영상을쉽게만들어주지는않습니다. 따라서 FFmpeg 라이브러리를사용하려면먼저동영상의특징과구조에대해알아야합니다. 1장에서는동영상에대한전반적인지식을살펴봅니다. 동영상을이루는요소에무엇이있는지와함께각각의요소가왜필요한지에대해서알아봅니다. 2장에서는동영상의요소중하나인컨테이너와코덱의특징을집중적으로살펴봅니다. 그리고현재이슈로떠오르는 4K 해상도가등장한이유와차세대코덱의특징을살펴보겠습니다.
chapter 1 동영상의구성 1.1 컨테이너 동영상파일은재생과편집을원활하게하기위한일련의규격을담고있습니다. 이러한규격을가진파일을컨테이너 Container 라고합니다. 동영상파일이어떤규격의컨테이너를가졌는지는파일의확장자로알수있습니다. [ 그림 1-1] 과같이컨테이너는하나이상의스트림 Stream 을가지고있습니다. 여기서스트림이란비디오, 오디오와같이시간에따라변하는일련의데이터를의미합니다. 그림 1-1 컨테이너의구성 컨테이너 (Container) 비디오스트림 오디오스트림 컨테이너는오직스트림을제어하기위한정보만을가지고있을뿐스트림이어떤방식으로압축되었는지는알수없습니다. 또한, 규격에맞는스트림만을담을수있기때문에모든형식의스트림을담을수는없습니다. 캡처된비디오와녹음된오디오를저장하기위해서는반드시이를제어할수있는컨테이너에담아야합니다. 이때컨테이너에스트림을담는일련의과정을멀티플 1 동영상의구성 - 003
렉싱 Multiplexing, 줄여서먹싱 Muxing 이라합니다. 반대로컨테이너에있는스트림을컨테이너에서분리하는일련의과정을디멀티플렉싱 Demultiplexing 이라합니다. 동영상컨테이너가스트림을제어하는데사용하는정보중대표적인것은다음과같습니다. 동영상촬영당시, 또는임의로기록된메타정보 ( 촬영날짜, 위치등 ) 컨테이너가가지고있는스트림의개수 동영상의전체길이 DVD에서제공하는메뉴와자막정보 인터넷을통한동영상재생 ( 스트리밍 ) 시빠른탐색 fast seek 에필요한스트림위치정보 물론모든컨테이너가이와같은정보를가지고있지는않습니다. 스트리밍에특화된컨테이너가있는가하면, 확장성을고려하여설계한컨테이너도있습니다. 또한, 예전에는하드디스크고장이잦았기때문에안전한저장을목적으로설계한컨테이너도있었습니다. 이와관련된자세한이야기는 2장에서살펴보겠습니다. 1.2 코덱 아날로그신호로이루어진영상을디지털영상으로변환하는작업에는여러어려움이있습니다. 가장큰어려움은아날로그데이터를압축하지않고저장하기에영상의크기가너무크다는것입니다. 그래서영상을조금더효율적으로압축하기위한연구가끊임없이이루어져왔습니다. [ 그림 1-2] 처럼코덱 Codec 은아날로그신호나스트림데이터로이루어진비디오와오디오를압축된부호로변환하기위한압축규격을제공하며, 이과정을인코딩 Encoding 이라합니다. 또한, 코덱은압축된데이터를본래의아날로그신호나스트림데이터로복원하기위한규격도제공하는데, 이과정을디코딩 Decoding 이라합 004 -
니다. 대부분코덱은인코딩과디코딩을모두지원하지만, 그렇지않은코덱도있 습니다. 디코딩에는제한이없지만인코딩하기위해서는로열티를내야하는코덱 도있습니다. 그림 1-2 코덱의역할 아날로그신호 / 스트림데이터 101010101010 코덱의압축방식에는원본이손상되는손실압축, 원본의손실없이그대로보전되는무손실압축이있습니다. 압축효율은손실압축방식이더높지만원본을보전해야하는파일이나편집과같은특수한상황에서사용할때는무손실압축방식을선호하기도합니다. 그림 1-3 압축률인자 q(100= 최대값, 1= 최소값 ) 에따른압축률비교 01 01 그림출처 : copyright 2008, Blender Foundation, www.bigbuckbunny.org 1 동영상의구성 - 005
Part 2 FFmpeg 라이브러리활용 FFmpeg은동영상의재생, 녹화, 스트리밍과변환을위해필요한기능을제공하는멀티미디어프레임워크입니다. 그중에서도가장강력한기능인영상변환에대하여살펴보겠습니다. 먼저 3장에서는라이브러리를사용하기전에알아두어야할내용에대해살펴봅니다. 개발환경을구성하는방법부터 FFmpeg에서제공하는기능에대해간략하게알아보겠습니다. 4장과 5장에서는 FFmpeg 라이브러리로영상을변환하는데필요한기능을단계별로설명합니다. 컨테이너에서스트림을분해하는과정부터영상을원하는규격으로인코딩하는방법까지살펴봅니다.
chapter 3 FFmpeg 살펴보기 FFmpeg은라이브러리규모가큰편인데다가사용되는외부라이브러리도많아서개발환경을구성하기가쉽지않습니다. 이번장에서는개발환경을구성하는방법과함께 FFmpeg이가진기능과 FFmpeg에서사용하는컨텍스트 Context 를간단하게살펴봅니다. 3.1 개발환경구성 이책에서는 FFmpeg 빌드를위해사용하는특별한설정이몇가지있습니다. 첫번째는독립된개발환경을위해라이브러리설치경로를변경합니다. 설치경로는 /opt/ffmpeg 입니다. 두번째로라이브러리는정적라이브러리를사용하지않고동적라이브러리를사용합니다. 정적라이브러리가필요할경우에는 --enable-static 옵션을추가하면됩니다. 마지막으로 H.264(x264) 와 AAC (fdk_aac), MP3(mp3lame) 를외부코덱으로사용합니다. NOTE 추가코덱이필요한경우에는 FFmpeg Codec 문서 (https://www.ffmpeg.org/ffmpeg-codecs. html) 에서사용할수있는코덱목록을확인할수있습니다. FFmpeg 은기본으로소프트웨어방식인코딩을사용합니다. 따라서사용할수 있는 CPU 자원이많으면많을수록좋습니다. 가상머신을사용할경우에는가상 3 FFmpeg 살펴보기 - 041
머신에 CPU 자원을많이할당하는것이큰도움이됩니다. 메모리는그렇게많이필요하지않습니다. 물론많은메모리를사용하도록프로그 램을개발할수도있습니다. 하지만사용할수있는 CPU 자원이제한되어있어서 많은메모리를사용하더라도인코딩성능이개선되지는않습니다. NOTE 이장에서는 CentOS 7을기준으로 FFmpeg을설치합니다. 데비안 / 우분투계열리눅스에서는다음링크를참고하여개발환경을구성할수있습니다. https://trac.ffmpeg.org/wiki/compilationguide/ubuntu 가장먼저 FFmpeg 을빌드하는데필요한컴파일러와빌드소프트웨어를설치합 니다. # yum install git autoconf automake cmake gcc gcc-c++ libtool make nasm pkgconfig zlib-devel 다음은추가라이브러리경로를위한설정입니다. /etc/profile 이나해당계정의 bashrc 에다음설정을추가합니다 ( 여기서는 /etc/profile 에추가하였습니다 ). FFMPEG_PREFIX=/opt/ffmpeg FFMPEG_BIN_PREFIX=$FFMPEG_PREFIX/bin export PATH=$PATH:$FFMPEG_BIN_PREFIX export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FFMPEG_PREFIX/lib export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$FFMPEG_PREFIX/lib/pkgconfig 이후환경설정을다음과같이적용합니다. # source /etc/profile 042 -
yasm 설치 x264를사용하기위해서는 x264에서사용하는 yasm 어셈블러가필요합니다. 설치경로는앞서설정한 $FFMPEG_PREFIX와 $FFMPEG_BIN_PREFIX를사용합니다. 적당한곳에 yasm을받은뒤다음과같이설치를진행합니다. git clone --depth 1 git://github.com/yasm/yasm.git cd yasm./autogen.sh./configure --prefix="$ffmpeg_prefix" --bindir="$ffmpeg_bin_prefix" make -j 4 make install x264 설치 yasm 을설치한후에는 H.264 인코더와디코더를사용할수있는 x264 를설치 합니다. git clone --depth 1 git://git.videolan.org/x264 cd x264./configure --prefix="$ffmpeg_prefix" --bindir="$ffmpeg_bin_prefix" --enableshared make -j 4 make install fdk_aac 설치 FFmpeg 에서는자체적으로 AAC 인코더를지원하지만 fdk_aac 로더높은품 질의 AAC 를얻을수있습니다. 여기서는 fdk_aac 로 AAC 를인코딩하겠습니다. git clone --depth 1 git://git.code.sf.net/p/opencore-amr/fdk-aac cd fdk-aac./autogen.sh./configure --prefix="$ffmpeg_prefix" --enable-shared make -j 4 make install 3 FFmpeg 살펴보기 - 043
LAME 설치 MP3 인코더와디코더로가장널리알려진 LAME 을설치합니다. 설치과정은다 음과같습니다. curl -L -O http://downloads.sourceforge.net/project/lame/lame/3.99/lame- 3.99.5.tar.gz tar -xvzf lame-3.99.5.tar.gz cd lame-3.99.5./configure --prefix="$ffmpeg_prefix" --enable-shared make -j 4 make install FFmpeg 설치외부코덱설치가모두완료되었다면 FFmpeg을설치합니다. 앞서설치한 x264 와 fdk_aac 인코더를사용하려면 FFmpeg의라이선스를 GPLv3으로변경해야합니다. 필터링을사용하는데필요한 avfilter도추가해야합니다. configure에서사용할수있는다양한옵션과이에대한설명은부록을참고하기바랍니다. git clone --depth 1 git://source.ffmpeg.org/ffmpeg cd ffmpeg./configure --prefix="$ffmpeg_prefix" --enable-shared --enable-gpl --enableversion3 --enable-nonfree --extra-cflags="-i$ffmpeg_prefix/include" --extraldflags="-l$ffmpeg_prefix/lib" --extra-libs=-ldl --enable-avfilter --enablelibx264 --enable-libfdk_aac --enable-libmp3lame make -j 4 make install 모든설치가끝나면정상적으로 FFmpeg 을실행할수있는지확인합니다. #ffmpeg ffmpeg version git-2015-06-03-9614df4 Copyright (c) 2000-2015 the FFmpeg developers built with gcc 4.8.3 (GCC) 20140911 (Red Hat 4.8.3-9) 044 -
configuration: --prefix=/opt/ffmpeg --enable-shared --enable-gpl --enableversion3 --enable-nonfree --extra-cflags=-i/opt/ffmpeg/include --extraldflags =-L/opt/ffmpeg/lib --extra-libs=-ldl --enable-avfilter --enable-libx264 --enable-libfdk_aac --enable-libmp3lame... 이렇게하여 FFmpeg 을사용할수있는환경구성이완료되었습니다. 3.2 FFmpeg CLI 사용법 FFmpeg 을설치하였다면 ffmpeg 과 ffprobe 를사용할수있습니다. 이번절에 서는 FFmpeg 라이브러리를사용하기전에간단하게 ffmpeg 과 ffprobe 프로 그램을사용해보겠습니다. NOTE 이책에서사용하는샘플동영상은다음주소에서다운로드할수있습니다. http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_ h264.mov 다른영상을사용하여도상관없습니다. 하지만테스트에사용할영상인만큼다음과같은조건을만족하면좋습니다. 비디오코덱은 H.264나 MPEG4와같이플랫폼에종속되지않는것이좋습니다. 오디오코덱도마찬가지로 AAC나 MP3가가장좋습니다. 영상의길이가길면그만큼 CPU 자원을쓰기때문에영상의길이가짧을수록좋습니다. 3.2.1 ffmpeg ffmpeg은영상을변환할때사용하는프로그램으로, FFmpeg 라이브러리에서사용할수있는모든기능이있습니다. 다음은 ffmpeg 프로그램의기본적인명령어입니다. # ffmpeg i [INPUT] c:v [video codec] c:a [audio codec] [OUTPUT] 3 FFmpeg 살펴보기 - 045
어떤영상을 H.264 와 AAC 영상으로변환하고싶다면다음과같이입력하면됩 니다. # ffmpeg -i big_buck_bunny_480p_h264.mov -c:v libx264 -c:a libfdk_aac./out.mp4 테스트영상은라이브러리를이용하여영상을사용하는데목적이있기때문에영 상이길어야할이유가없습니다. 따라서앞으로사용할샘플영상의길이를다음 과같이조절합니다. # ffmpeg -i big_buck_bunny_480p_h264.mov -ss 00:00:00 -t 00:01:00 -c:v libx264 -c:a libfdk_aac./sample.mp4 3.2.2 ffprobe ffprobe 는특정영상에대한정보를빠르게파악할수있기때문에가장많이사 용되는스캐닝툴입니다. 비슷한툴로는 MediaInfo 01 가있습니다. 다음은 ffprobe 프로그램의기본적인사용방법입니다. # ffprobe./sample.mp4... Input #0, mov,mp4,m4a,3gp,3g2,mj2, from./sample.mp4 : Metadata:... Duration: 00:01:00.04, start: 0.042667, bitrate: 1491 kb/s Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 854x480, 997 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)... Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 488 kb/s (default)... 01 https://mediaarea.net 046 -
컨테이너와코덱에대한정보를한눈에볼수있습니다. 더자세한정보가필요한 경우에는 -show_streams 옵션을추가하면확인할수있습니다. # ffprobe./sample.mp4 -show_streams [STREAM] index =0 codec_name=h264 codec_long_name=h.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 profile=high codec_type=video... [/STREAM] [STREAM] index =1 codec_name=aac codec_long_name=aac (Advanced Audio Coding) profile =LC codec_type=audio... [/STREAM] Part 1 에서본익숙한용어가보입니다. ffprobe 는영상을분석할때가장먼저 사용하는툴이며소스도매우간단하여 FFmpeg 라이브러리에익숙해지기위해 서는소스를분석해보는것도큰도움이됩니다. 3.3 FFmpeg 구조 FFmpeg 은컨테이너와스트림, 코덱을관리하기위해 [ 그림 3-1] 과같이각각의 컨텍스트라는구조체로관리합니다. 그림 3-1 FFmpeg 구조 컨테이너 (AVFormatContext) 스트림 (AVStream) 코덱 (AVCodecContext) 3 FFmpeg 살펴보기 - 047
AVFormatContext AVFormatContext는파일로부터읽은컨테이너의내용을저장하거나새로생성한컨테이너를파일에쓰기위한용도로사용합니다. AVFormatContext 안에는상당히많은변수가들어있는데읽은파일에서사용하는변수와파일을쓰기위해사용하는변수가같은컨텍스트안에있기때문입니다. AVStream AVFormatContext 내부에는적어도하나이상의스트림이있습니다. 허용가능한최대스트림개수는컨테이너의종류에따라다르며, 이스트림정보는 AVStream 컨텍스트안에있습니다. AVStream 컨텍스트에서는시간과관련된정보를가져올수있습니다. 가장많이사용하는정보로는프레임레이트와타임베이스 Timebase 가있습니다. NOTE 타임베이스는컨테이너가영상을재생할때사용하는시간단위로, FFmpeg에서는타임베이스를변환하는과정이두군데있습니다. 첫번째는파일을읽은직후입니다. 원본컨테이너에서사용하는타임베이스를 FFmpeg에서사용하는타임베이스로변경하여변환작업에유용하게사용하기위해서입니다. 두번째는인코딩이후파일을쓰기전입니다. FFmpeg에서사용하는타임베이스를컨테이너에서사용하는타임베이스로변환해야컨테이너에서정상적인재생이가능하기때문입니다. AVCodecContext AVStream 안에는코덱과관련된정보를가진 AVCodecContext가있습니다. 이컨텍스트는 AVStream 안에한개만있으며코덱의종류에따라가진정보가다를수있습니다. 비디오코덱인경우에는해상도, 픽셀포맷과같은정보가있으며오디오의경우에는샘플레이트, 채널개수와같은정보를담고있습니다. 048 -