[FFmpeg] 기본 소스코드

2016. 8. 30. 18:32Application 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"NULLNULL);
    //미디어 파일 열기
    //파일의 헤더로 부터 파일 포맷에 대한 정보를 읽어낸 뒤 첫번째 인자 (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