FFmpeg Player with Visual Studio - 04 FFmpeg을 이용하여 미디어 파일 열기 └ FFMPEG

4. FFmpeg을 이용하여 미디어 파일 열기


이번 강좌에서는 FFmpeg을 이용해서 어떻게 미디어 파일 또는 미디어 스트림을 열고, 미디어의 정보를 가져올 수 있는지 알아보도록 하겠습니다.


> Library 초기화 하기


거의 모든 오픈소스 Library들은 사용하기에 앞서 초기화가 필요합니다. FFmpeg의 초기화 과정은 전혀 어렵지 않습니다. 프로그램 시작 부에 아래 함수를 한번만 호출해 주시면 됩니다.


av_register_all();


av_register_all() 함수는 말 그대로 ffmpeg에서 지원되는 모든 Demuxer, Muxer, Protocol 및 Codec 등을 사용할 수 있도록 등록하는 행위입니다. ( 여기서 말한 지원되는 모든 컴포넌트들은 Library 버전에 따라서도 다를 수 있지만, Library를 컴파일 하는 과정에서 옵션으로 enable/disable 시킨 여부에 따라서 다를 수 있습니다.)


만일 네트워크를 통한 입력 source ( rtsp, rtp, udp, hls 스트림 등 ) 를 처리 할 일이 있다면, 아래의 추가 초기화 함수를 호출해 주시면 됩니다.


avformat_network_init();


avformat_network_init() 함수는 network 사용을 위한 추가 초기화 작업을 수행합니다. 가령 windows의 경우 winsock을 사용하기 위해서 초기화 함수인 WSAStartup() 함수를 호출해줘야 하는데, 그런 과정을 저 함수에서 처리한다고 보시면 됩니다. 이 함수를 호출했다면, 종료 시 해제 함수 avformat_network_deinit(); 을 같이 호출해 주셔야 합니다.


> 미디어 파일을 열어 보자!!


FFmpeg을 이용해서 미디어 파일을 열기 위해서는 최소한 파일의 URL 또는 파일 이름이 필요합니다. 당연한 내용이지요? 우리는 아래 함수를 이용하여, 미디어 파일을 열 수 있습니다.


avformat_open_input (AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);


첫번째 패러미터는 AVFormatContext 구조체 입니다. 사용자가 avformat_alloc_context() 함수를 이용하여 직접 생성한 후 넘겨줘도 되고, NULL을 가리키는 포인트 변수를 넘겨서 내부에서 생성하도록 하셔도 됩니다.

참고로 AVFormatContext 구조체는 FFmpeg Library중 avformat Library의 가장 핵심적인 데이터 타입으로, 주로 I/O 및 Muxing/Demuxing 과정에 사용됩니다. 마치 c library의 FILE 포인터와 같이 미디어 I/O 및 Muxing/Demuxing에 필요한 정보들을 포함하고 있습니다.

avformat_open_input() 함수는 첫번째 인자로 넘긴 AVFormatContext 구조체에 I/O 및 Muxing/Demuxing에 필요한 정보를 채워주는 역할을 합니다.


두번째 패러미터는 열고자 하는 파일이름입니다. 단순히 변수 이름이 filename 이라고 해서 파일만 가능한 것이 아니라, rtsp, udp 등 스트리밍 URL 모두 가능합니다. 굳이 다시 이름 붙이자면 Input Source 정도가 적당할 것 같네요.


세번째 패러미터는 강제로 Input Format을 지정할 경우에 사용됩니다. 그냥 NULL 값으로 지정하시면 입력 소스에 따라서 자동으로 Input Format을 검색합니다.


마지막 패러미터는 demuxer의 추가 옵션을 지정할 때 사용합니다. 이 패러미터 역시 잘 사용하지 않으므로 그냥 NULL 값을 넣어주시면 됩니다. 몇몇 특수한 경우, 가령 raw-video 를 demuxing 할 일이 발생한다거나 할 때, ( 파일에는 아무 정보도 없기 때문에 Parsing을 위해서 raw-video의  video 해상도 크기 및 Color 포맷을 알려줘야 하겠죠? ) 해당 정보를 이 옵션 패러미터로 넘겨주는 겁니다.


> 미디어 정보를 가져오자


avformat_open_input() 함수에서 미디어 파일을 열 때, 파일 헤더 정보가 존재하면 미리 같이 읽습니다. Input Format에 따라서는 파일 헤더 정보에 모든 내용이 기록된 포맷도 있겠지만 정보가 충분하지 않거나, 헤더가 없는 Format도 존재합니다. 이 경우 부족한 정보를 얻기 위해서는 어떻게 해야할까요? 그렇습니다. 충분한 정보를 얻기 위해서 미리 Data를 조금 읽어들여서 Parsing 또는 Decode 해보는 방법이 있습니다. FFmpeg Library는 이를 위해서 다음과 같은 함수를 제공합니다.


avformat_find_stream_info( AVFormatContext *ic, AVDictionary ** options );


첫번째 패러미터는 앞서 avformat_open_input()에 사용한 AVFormatContext 객체를 사용하시면 됩니다.


두번째 패러미터는 Codec 옵션을 지정할 때 사용합니다. 때에 따라서는 정보를 얻기 위해서 미리 Data를 Decode 해봐야 할 때가 있는데, 그 때 임시로 생성할 Codec에 넘겨줄 Codec 옵션을 지정합니다. 역시 잘 사용하지 않으므로 그냥 NULL 값을 넣어주시면 됩니다.


참고로 avformat_find_stream_info() 는 blocking 함수 입니다. Input Source로 Network Protocol을 사용한다면 정보가 담겨있는 패킷이 발견될 때까지 계속해서 Read를 시도하기 때문에 시간이 지연되거나, 최악의 경우 패킷이 들어오지 않는다면, block되어 버리는 일이 발생할 수도 있으니 주의합시다.


> 미디어 파일을 닫자


마지막으로 열었던 미디어 파일을 닫아보겠습니다. 다음 함수를 호출해서 파일을 닫을 수 있습니다.


avformat_close_input (AVFormatContext **s);


위 함수는 단순히 열려있는 파일을 닫는 기능 뿐만아니라  avformat_open_input() 또는 avformat_alloc_context() 함수를 통해 할당된 AVFormatContext 객체 s 를 해제까지 해줍니다. 즉, 따로 free 계열의 함수를 호출할 필요 없이, 이 함수 하나로 파일 닫기 및 자원 해제가 가능합니다.


> 정리


지금까지의 과정을 실제 코드로 정리를 해보도록 하겠습니다.

다음 코드는 AVFormatContext를 할당하고, 특정 파일을 열며 (포맷 등은 자동으로 검색), 스트림 정보를 뽑아내서 AVFormatContext에 정보를 저장하는 과정을 보여주는 코드입니다.



const char *szFilePath = "test.mp4";

///> Initialize libavformat and register all the muxers, demuxers and protocols.
av_register_all();

///> Do global initialization of network components.
avformat_network_init();

int ret;
AVFormatContext *pFmtCtx =
NULL;

///> Open an input stream and read the header.
ret = avformat_open_input( &pFmtCtx, szFilePath,
NULL, NULL );
if( ret != 0 ) {
av_log(
NULL, AV_LOG_ERROR, "File [%s] Open Fail (ret: %d)\n", ret );
exit( -1 );
}
av_log(
NULL, AV_LOG_INFO, "File [%s] Open Success\n", szFilePath );

///> Read  of a media file to get stream information
ret = avformat_find_stream_info( pFmtCtx,
NULL );
if( ret < 0 ) {
av_log(
NULL, AV_LOG_ERROR, "Fail to get Stream Information\n" );
exit( -1 );
}
av_log(
NULL, AV_LOG_INFO, "Get Stream Information Success\n" );

///> Close an opened input AVFormatContext.
avformat_close_input( &pFmtCtx );

///> Undo the initialization done by avformat_network_init.
avformat_network_deinit();


첨부한 소스코드에는 정보를 출력하는 부분까지 추가되어 있습니다.

(visual studio 2010용 프로젝트 파일입니다)

FFmpegFirst.7z.001
FFmpegFirst.7z.002

프로젝트를 여신 후에 szFilePath 값을 바꿔가면서 테스트 해보세요.

입력은 반드시 파일일 필요가 없으며, HLS, UDP 등의 네트워크 스트림도 가능합니다.


이번 강좌는 여기서 마치도록 하겠습니다.




FFmpeg Player with Visual Studio - 03 미디어 파일 └ FFMPEG

3. 미디어 파일


이번 장에서는 본격적인 실습에 앞서, 미디어 파일에 대한 간략한 설명과 함께 플레이어가 어떤 과정을 거쳐서 미디어 파일을 재생하게 되는지에 대해서 알아보려고 합니다. 비록 자세한 설명은 아니지만 향후 강좌 이해에 조금이나마 도움이 될까해서 이번 장을 마련했습니다.


> 미디어 파일


이후 제 강좌에서 미디어 파일이란 “플레이어에서 재생하기 위한 오디오/비디오 데이터를 가지고 있는 파일” 이라고 정의하겠습니다. 물론 이게 미디어 파일에 대한 올바른 정의라고 보기는 힘들지만 최소한 이번 장에서 만큼은 위의 의미로 사용할 것입니다.


오늘 날 우리는 많은 미디어 파일을 접하고 있습니다. 누구나 컴퓨터를 통해서 동영상을 재생해 본 경험이 있을 것입니다. 그럼 이런 미디어 파일은 어떻게 만들어질까요?

먼저 미디어 파일이 어떻게 만들어지는지를 한번 알아봅시다.


완전하지는 않지만 대략적으로 미디어 파일은 아래의 과정을 걸쳐서 만들어지게 됩니다.




과정을 좀 더 자세하게 들여다 봅시다. 크게 2가지 과정이 필요합니다.


A. 가공되지 않은 원본 영상 및 소리 ( Video/Audio Source 입니다 ) 를 압축 및 가공하는 Encoding (인코딩) 과정이 있습니다. 결과물을 Video / Audio Elements 라고 하겠습니다. 데이터를 가공해 주는 녀석을 우리는 Encoder (인코더) 라고 부르며, 여기서 말하는 Encoder (인코더) 가 (이후 언급할 Decoder(디코더)와 합쳐서 ) 우리가 흔히 말하는 Codec (코덱) 입니다. 모두 한번쯤은 들어보셨을 겁니다. H.264 (AVC) 라던가 최근 UHD 컨텐츠에 주로 사용되고있는 H.265(HEVC) 등이 그것입니다.


그렇다면 왜 인코딩 과정이 필요할까요?

여러가지 이유가 있겠지만 가장 큰 이유는 역시 가공되지 않은 원본 영상 및 소리의 크기가 너무 크기 때문입니다. 이 부분은 매우 크리티컬한 이슈가 됩니다. 데이터가 크기가 너무 클 경우 이는 곧 원할한 재생을 보장하지 못하기 때문입니다.

가령, 최근 보편화되고 있는 FHD 영상을 예로 들어 보겠습니다.

FHD 해상도 영상 (Image)의  경우 한장당 압축하지 않은 이미지의 크기가 약 6MB 정도 합니다. 보통 영상이 1초에 30 프레임으로 재생된다고 했을 때, 1초에 디스크에서 읽어야 할 데이터의 크기는 영상만 놓고 봤을 때, 약 180 MB 가 됩니다. 최신 PC에서는 그럭저럭 허용 범위입니다만, 그 외 구형 PC나 모바일 환경 및 HDD보다 상대적으로 I/O가 매우 느린 ODD를 통한 재생의 경우에는 원할한 재생을 보장하기 힘들 수 밖에 없습니다.


B. Source를 압축, 가공 한 후에는 결과물인 Video / Audio Elements 들을 포장하는 Muxing ( Muxing ( 먹싱 ) 은 Multiplexing ( 멀티플렉싱 ) 의 약자입니다 ) 과정이 있습니다. 일반적으로 한 종류의 Video와 Audio 를 포장하지만 경우에 따라서는 다수의 Video / Audio Elements를 포장하는 경우도 있습니다. 이 결과물이 우리가 원하는 미디어 파일이 됩니다.


포장을 하기 위해서는 Elements들을 담을 무언가가 필요하겠죠? 간단하게 상자를 상상해 봅시다. 상자의 (크기나 모양에 따른) 종류에 따라서 우리는 서로 다른 방식으로 포장을 하게 됩니다. 이런 상자들을 우리는 Container (컨테이너) 포맷이라고 합니다. 우리는 이러한 컨테이너 포맷을 자주 접하고 있습니다. 바로 파일의 확장자를 통해서죠. 미디어 파일 형식에는 다양한 종류가 있죠? AVI, MPG, MOV, MKV, MP4, 3GP 등 이 모두가 컨테이너 포맷들입니다.




참고로 종종 파일 확장자(컨테이너 포맷)와 코덱을 동일시 하시는 분들이 계시는데 다르게 보시는게 맞습니다. 물론 mp4 포맷에는 H.264 코덱을 사용하라고 강력히 권하고 있고, 그로 인해 대부분의 mp4 파일의 영상은 H.264로 인코딩 되어 있습니다.  때문에 보통 mp4 파일은 H.264라고 봐도 무방합니다만, 컨테이너 포맷과 코덱의 개념은 분명히 분리하고 가야 한다고 봅니다. 예로 mp4 포맷에 MPEG4 코덱이 사용될 수도 있고, MPG 포맷에 H.264 코덱이 사용될 수 있습니다. ( 물론 미디어 파일 중 오디오 전용 미디어 파일만 놓고 봤을 때는 파일확장자가 곧 코덱 이름인 것도 있습니다. 가령, mp3 파일이나 flac 파일 등은 코덱이름 역시 파일 확장자와 같습니다.  )


> 플레이어가 하는 일


그렇다면, 플레이어가 하는 일은 무엇일까요?

그렇습니다. 위에서 미디어 파일을 만들기 위한 과정을 역으로 진행하면 바로 플레이어가 하는 일이 됩니다.




A. 가장 먼저 Demuxing 과정입니다. 컨테이너 포맷 이라는 상자를 열고 안에 내용물을 들여다 봅니다.


컨테이너 포맷 안에는 설명서 또는 명세서 역할을 하는 특별한 데이터가 들어있습니다. 해당 데이터를 분석함으로써 우리는 이 상자 (컨테이너 포맷) 안에 몇 종류의 Video/Audio Elements들이 들어있고, 어떤 코덱을 사용하여 인코딩 되어있는지 등의 정보를 알 수 있습니다. 이 단계에서 우리는 Video/Audio Elements들을 디코딩하기 위한 디코더를 준비할 수 있습니다.


디코더가 준비되었다면, 상자 (컨테이너 포맷) 에서 Video/Audio Elements들을 하나씩 꺼내기 시작힙니다.


B.  상자 (컨테이너 포맷) 에서 꺼낸 Video/Audio Elements들은 준비된 디코더에 의해서 디코딩이 진행됩니다. 디코딩 된 Elements 들은 각각 원본 영상 및 소리로 변환됩니다.


C. 사용자가 원한다면, 이 단계에서 원본 영상 및 소리를 가지고 후처리 작업을 진행할 수도 있습니다. ( 영상처리 작업이나 소리 보정 또는 왜곡 등 다양한 작업을 진행해 볼 수 있겠죠? )


D. 마지막으로 플레이어는 영상과 소리를 시간에 맞게 잘 동기화해서 화면 또는 스피커로 출력해주면 됩니다. 일반적으로 사람은 영상보다는 소리에 민감하기 때문에 소리를 계속해서 재생하면서 소리 시간에 맞추어 영상을 출력해 주는 동기화 방법을 가장 많이 사용합니다.


> 플레이어에서 FFmpeg의 역할


그렇다면 FFmpeg 라이브러리는 어디까지 지원해 줄까요? 앞서 제일 첫 시간에 FFmpeg에 미디어 처리에 관련된 거의 모든 과정을 지원한다고 했었습니다. 따라서 위에서 언급한 과정 중 마지막 과정인 출력 (E) 을 제외한 모든 과정 (A ~ D)을 FFmpeg 라이브러리를 이용해서 처리한다고 보시면 되겠습니다.



다음 시간에는 FFmpeg 라이브러리를 이용해서 Demuxing 을 어떻게 시작하는지에 대해서 알아보도록 하겠습니다. 이제부터 본격적인 FFmpeg 코딩이 들어갑니다 ^^



FFmpeg Player with Visual Studio - 02 Project 생성하기 └ FFMPEG

2. Project 생성하기


> Library 준비하기


앞선 강좌에서 설명한대로  http://ffmpeg.zeranoe.com/builds/ 에서 Windows용 빌드 파일들을 다운로드 받습니다.


FFmpeg-xxxxxx-win32-dev 파일에서 include / lib 폴더만



그리고 FFmpeg-xxxxxxx-win32-shared 파일에서 bin 폴더만



별도의 공간에 압축을 풀어둡시다.



Visual C++를 통해서 ffmpeg 프로그램을 만들기 위해서는 준비과정이 하나더 필요합니다

( gcc 계열로 컴파일 하시는 분들은 건너뛰셔도 됩니다 )


Visual stduio 의 버전이 2013 이전 버전이라면, inttypes.h 파일을 추가해 줘야 하는데요.

아래 사이트에서 해당 파일을 받을 수 있습니다


https://code.google.com/p/msinttypes/



다운로드를 받고 압축을 풀어보면 2개의 헤더 파일을 볼 수 있습니다



VC++ 2010을 기준으로 stdint.h 는 제공되고 있으므로, 사실 상 필요한 것은 inttypes.h뿐이지만, VC++ 6.0 의 경우 stdint.h 가 없으므로, 같이 포함되어 있는 헤더파일을 사용하면 됩니다.


이번 강좌에는 VC++ 2010을 기준으로 작성했기 때문에 stdint.h가 있다는 전제하에 진행하겠습니다.


inttypes.h 헤더 파일만 아까 압축을 풀어둔 ffmpeg 폴더 내의 include/libavutil/ 밑에 복사합니다.

그리고 include/libavutil/common.h 파일을 Text Editor로 열어서 아래와 같이 편집합니다.


#include <inttypes.h>  ->  #include “inttypes.h”



common.h와 같은 디렉토리에 있는 (방금 복사한) inttypes.h를 우선 불러오도록 하기 위함입니다.


어찌되었든, 컴파일러로 하여금 inttypes.h를 불러올 수 있도록 하는 조치이기 때문에

사실, inttypes.h를 VC의 기본 include 폴더에 복사하셔도 무방합니다만,


일단 inttypes.h를 설치한 목적이 ffmpeg 프로젝트를 위해서 이기 때문에 이렇게 사용하는 것도 나쁘지 않은 방법입니다.


> Project 생성


이제 본격적으로 시작해 보도록 하겠습니다


Visual Studio ( 또는 C++ )를 열고 프로젝트를 생성합니다


Win32 프로젝트를 하나 생성할 것입니다

강좌에서는 Console 프로젝트로 생성해서 진행할건데, 꼭 Console 프로젝트 일 필요는 없습니다.




프로젝트를 생성할 때는, Empty Project로 설정합시다




이제 프로젝트 속성 설정을 해주도록 하겠습니다

아래 3가지 중 한가지 방법으로 속성창을 띄우도록 합시다


1. Solution Explorer에서 프로젝트에 마우스 오른쪽 버튼을 클릭 -> Properties

2. Menu의 Project -> Properties

3. 단축키 Alt + F7


먼저 유니코드 설정부터 해제하겠습니다. ( VC++ 6.0 사용자는 필요없는 과정입니다 )

왼쪽 속성 목록에 General (일반) 설정이 Default 로 떠있습니다.

Character Set이 [Use Unicode Character set ] 으로 설정되어 있을텐데, 이를 [Not Set]으로 바꿔줍니다.




다음은 ffmpeg 라이브러리를 사용할 수 있도록 Path 설정을 하는 것입니다.

일반적으로 Visual C++에서는 Path 설정을 2가지 방법으로 할 수 있습니다.

“VC++ Directories” 를 이용한 방법과 C++ 및 Linker 설정에서 “Additional Include / Library Directories” 에서 설정하는 방법입니다. (아래 이미지 참조)


[VC++ Directories]





[Additional Include / Library Directories]





** 왼쪽의 C/C++ 속성이 보이지 않는다면 속성 창을 닫고, 프로젝트에 빈 cpp 파일을 하나 추가하신 후, 다시 속성 창을 열어보면 생겨있습니다.


참고로 “VC++ Directories”에 등록하는 방법은 VC++ 2010 이전에는 Global Path였습니다. 다시 말해 한번 설정해 놓으면 이후 새로운 프로젝트를 생성할 때, 다시 Path를 등록 시키지 않아도 사용할 수 있었습니다. ( 2010 이후 부터는 프로젝트 속성으로 바뀌면서, 별도로 Global Path를 설정하지 않는 이상, Project 단위로 다시 Path를 추가해야 합니다 )


Path를 지정하는데에는 어느 쪽을 사용해도 문제는 없습니다만, 저 같은 경우 Project단위로 소스코드를 배포하는 일이 많았던 지라 후자를 더 사용하고 있는 편입니다.


Include Directories 에는 아까 압축을 풀었던 Include 폴더의 Path를

Library Directories 에는 아까 압축을 풀었던 Lib 폴더의 Path를 작성합니다.


가령, 아까 압축을 풀어둔 폴더의 Path가 D:\ffmpeg 인 경우,

Include Directories에는 “D:\ffmpeg\include” 를 추가하고,

Library Directories에는 “D:\ffmpeg\lib” 를 추가합니다.


마지막으로 컴파일 후, 바로 실행할 수 있도록 dll path를 지정하도록 하겠습니다.

역시, 속성 창에서 진행됩니다.


아래 화면과 같이 속성 목록의 “Debugging” 을 선택하고 Environment(환경) 에 설정하시면 됩니다.



아래와 같이 입력합시다


PATH=%PATH%;$(압축을 풀어둔 폴더)\bin


가령, 아까 압축을 풀어둔 폴더의 Path가 D:\ffmpeg 인 경우,

PATH=%PATH%;D:\ffmpeg\bin

이 됩니다.


> Hello FFmpeg


이번 시간에는 간단하게 Console에 “Hello FFmpeg” 이라는 문구만 찍는 아주 단순한 프로그램만 만들어보도록 하겠습니다.


main.cpp


///> Include FFMpeg

extern "C" {

#include <libavformat/avformat.h>

}


///> Library Link On Windows System

#pragma comment( lib, "avformat.lib" )

#pragma comment( lib, "avutil.lib" )


int main(void)

{

av_log( NULL, AV_LOG_INFO, "Hello FFmpeg\n" );

return 0;

}


만일 프로젝트 세팅 및 모든 과정이 정상적으로 되었다면,

Console 창이 뜨면서 “Hello FFmpeg” 이라는 문구가 뜰 것입니다.


아래 링크는 VC++ 2010용 샘플 프로젝트 파일입니다.

(dll포함) Library를 모두 포함하고 있어서 약 12MB 정도입니다만,

프로젝트를 열어서 바로 실행해 볼 수 있겠금 했습니다.


HelloFFmpeg.7z.001

HelloFFmpeg.7z.002


다음 시간에는 ffmpeg을 이용해서 미디어 파일을 열고 닫는 방법에 대해서 알아보겠습니다



FFmpeg Player with Visual Studio - 01 시작하기에 앞서 └ FFMPEG

1. 시작하기에 앞서

> FFmpeg 이란?

FFmpeg은 쉽게 말해 cross-platform 미디어 술루션 이라고 보시면 됩니다. 거의 모든 미디어 작업을 FFmpeg을 통해서 처리할 수 있습니다. (거기다가 오픈소스입니다 ^^)
여기서 말하는 미디어 작업이란 그 범위가 굉장히 넓습니다. 녹화, 변환 (흔히 말하는 영상 인코딩 작업), 재생 (디코딩 작업을 지원합니다), 스트리밍 서버 등. 이 모든 작업을 FFmpeg을 통해서 진행할 수 있습니다.

FFmpeg은 미디어 솔루션으로서 하나의 프로그램 형태로도 제공이 되며, 또한 개발용 Library 형태로도 제공이 됩니다. ( 단, 공식 홈페이지에서는 빌드 된 결과를 직접 제공하지 않고, 소스코드를 제공하기 때문에 별도의 라이브러리 빌드 과정이 필요합니다 )

본 강좌의 목적은 FFmpeg Library를 이용하여 Player를 개발해 보는 것입니다.

FFmpeg에 대한 보다 자세한 정보는 공식 홈페이지 및 wiki를 참조하세요
http://www.ffmpeg.org/
http://trac.ffmpeg.org/wiki

> 개발환경 준비하기

필자가 사용한 개발툴은 Visual Studio 2010 입니다. 검증은 따로 못했지만, 같은 VS 계열이면 본 강좌를 그대로 따라해도 버전에 크게 상관없이 동작될 것으로 생각합니다. (VS 6.0은 보장 못합니다 ^^;;;)

기본적으로 이 강좌를 보시는 분들은 어느정도 개발에 대한 이해도가 있다고 생각하고 진행할 것이기 때문에, 개발툴 설치에 대한 설명은 생략하도록 하겠습니다

또한, 추가적인 Library가 필요하다면 강좌 중간중간에 따로 설치 등에 관련된 글을 올릴 것이니, 그 때 확인해 주시면 됩니다

> FFmpeg Library 설치하기

앞서 FFmpeg의 경우 빌드된 형태의 Library를 따로 제공하지 않고, 소스코드로 제공한다고 언급했습니다. 소스코드를 Library로 빌드하는 방법을 설명드려야 하는데 Windows 시스템에서는 FFmpeg 빌드를 위해서 별도의 설치 작업 등이 필요하기 때문에 일단 생략하고자 합니다.

해당 내용에 대해서는 추후에 다루도록 하겠습니다

그렇다면, 빌드된 Library 파일들을 어떻게 구할 것인가?
다행히도, http://ffmpeg.zeranoe.com/builds/ 에서 Windows용 빌드 파일들을 제공하고 있습니다.

사이트에 들어가셔서, 중앙에서 다운로드 받을 수 있습니다



우리가 필요한 것은 가장 하단에 있는 Dev 버전과 실행을 위한 DLL이 포함된 Shared 버전 2개를 받으시면 됩니다

FFmpeg-xxxxxx-win32-dev 파일에서 include / lib 폴더가 필요하고, FFmpeg-xxxxxxx-win32-shared 파일에서 bin 폴더 내부의 dll 파일들이 필요합니다

Visual Studio 에서 어떻게 세팅하면 되는지는 다음 강좌에서 직접 진행하면서 설명드리겠습니다.

> FFmpeg 버전

일반적으로 FFmpeg에 대한 자료를 검색해보면 대부분의 경우 1.0 이전 버전들이 많은데, 강좌에서는 가능한 최신 버전을 기준으로 작성해 보았습니다

제가 FFmpeg을 처음 시작했을 때의 버전은 2.0.1 버전이었고, 강좌에 사용된 소스코드의 경우 최신 버전인 2.2 버전에서도 돌아가는 것을 확인했습니다

FFMpeg Player 프로그래밍 강좌를 시작하며 └ FFMPEG

본 카테고리는
본인이 FFMpeg Library를 이용해서 플레이어를 만들면서 겪었던 온갖 삽질을 바탕으로
향후 본인이 다시 참조하기 위한 목적도 있고,
처음 시작하는 사람들에게 삽질을 조금이나마 적게 시키기 위해서 작성한 강좌이다.

1. 기본적으로 Windows를 기반으로 FFMpeg 을 이용한 Player를 제작하는 방법에 대해서 설명할 것이며,

2. 이를 기반으로 Android 용 Player 제작도 같이 병행할 것이다

3. 그리고 마지막으로, Android용을 위해서 ffmpeg 라이브러리를 컴파일 하는 법까지 살펴볼 예정이다

회사에서 시간날 때 마다 틈틈히 정리해서 강좌를 올릴 예정이라...
강좌 진행 속도는 좀 느릴 수 있습니다 -ㅂ-;;;

1 2 3 4 5 6 7 8 9 10 다음