[FFmpeg] 기본 소스코드
2016. 8. 30. 18:32ㆍApplication Programming/FFmpeg
헤더 파일
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ///> Include FFMpeg extern "C" { #include <libavformat/avformat.h> #include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libswresample/swresample.h> #include <libswscale/swscale.h> #include <libavutil/opt.h> } ///> Library Link On Windows System #pragma comment(lib,"avformat.lib") #pragma comment(lib,"avcodec.lib") #pragma comment(lib,"swresample.lib") #pragma comment(lib,"swscale.lib") #pragma comment(lib,"avutil.lib") #pragma comment( lib, "avformat.lib" ) #pragma comment( lib, "avutil.lib" ) | cs |
--> C++는 다형성으로 인해 함수의 이름 뿐만 아니라 인수의 타입도 함께 사용해서 함수를 구분한다. 이와 다르게 C에서는 이름만으로 함수를 구분할 수 있기 때문에, extern "C" 안에 코드를 포함하면 C의 linkage 방식을 사용하라고 컴파일러에게 알려주는 것이다.
--> #pragma comment()로 라이브러리를 링크하면 주석표시 없이도 명시적으로 라이브러리를 포함할 수 있다.
C++ 파일
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include "Header.h" int main(void) { av_register_all(); //ffmpedg에서 지원되는 모든 Demuxer, Muxer, Codec, Protocol을 사용할 수 있도록 등록 //전체 코드에서 한 번 불러주면 된다! AVCodec * m_Codec; //어떤 코덱인지 AVCodecContext * m_Context; //어떻게 디코딩 할 것인지 AVFormatContext *pFormatCtx = NULL; int ret = avformat_open_input(&pFormatCtx, "C:\\Sample.mp4", NULL, NULL); //미디어 파일 열기 //파일의 헤더로 부터 파일 포맷에 대한 정보를 읽어낸 뒤 첫번째 인자 (AVFormatContext) 에 저장한다. //그 뒤의 인자들은 각각 Input Source (스트리밍 URL이나 파일경로), Input Format, demuxer의 추가옵션 이다. if (ret != 0) { av_log(NULL, AV_LOG_ERROR, "File Open Failed\n"); exit(-1); } //파일이 제대로 열리지 않는다면 실패했다는 로그와 함께 종료 av_log(NULL, AV_LOG_INFO, "File Open Success\n"); //콘솔창에 로그메시지를 띄운다 ret = avformat_find_stream_info(pFormatCtx, NULL); //열어놓은 미디어 파일의 스트림 정보를 가져온다 if (ret < 0) { av_log(NULL, AV_LOG_ERROR, "Fail to get Stream Inform\n"); exit(-1); } av_log(NULL, AV_LOG_INFO, "Get Stream Inform Success\n"); avformat_close_input(&pFormatCtx); //열었던 미디어파일 닫기 system("pause"); return 0; } | cs |
--> 스트림 이란?
일관된 데이터의 흐름으로, 동영상에는 비디오 스트림과 오디오 스트림이 포함되어 있다고 말한다.
FFmpeg에는 AVFormatContext라는 이름의 Structure에 streams 라는 이름의 AVStream 구조체의 포인터 배열과 nb_streams라는 변수가 있다. nb_streams는 총 몇개의 스트림이 포함되어 있는지를 나타내고, 이 갯수만큼의 길이를 가진 streams에 각각의 스트림이 저장되어있다. 스트림의 타입은 총 6가지로 각각 Unknown, Video, Audio, Data, Subtitle, Attachment 이다.
'Application Programming > FFmpeg' 카테고리의 다른 글
[FFmpeg] 동영상 디코딩 (1) | 2016.08.31 |
---|---|
[FFmpeg] 환경 구축 (0) | 2016.08.27 |