extern "C"{

#include <libavformat/avformat.h>

}


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

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

//avutil.lib



const char *AVMediaType2Str(AVMediaType type);

const char *AVCodecID2Str(AVCodecID id);


int main(void)

{

const char *szFilePath = "파일경로"


// Init

av_register_all();



// Init to play streaming contents, 

avformat_network_init();

int ret;

AVFormatContext *pFmtCtx = NULL;


// avformat_open_input

// 1, AVFormatContext,

// 2, 파일이름

// 3, 강제로 Input Format 지정 NULL 시 자동 Input Format

// 4, demuxer 추가 옵션

ret = avformat_open_input(&pFmtCtx, szFilePath, NULL, NULL);

if (ret != 0)

{

av_log(NULL, AV_LOG_ERROR, "File [%s] Open Fail (ret: %d)\n", szFilePath, ret);

exit(-1);

}

av_log(NULL, AV_LOG_INFO, "File[%s] Open Success\n", szFilePath);

// 포맷 확인 

av_log(NULL, AV_LOG_INFO, "Format: %s\n", pFmtCtx->iformat->name);



// 해당 함수가 있어야 Duration 에서 0 값 들어 오는 경우가 생기지 않음 

// read packets of a media file to get stream information.

ret = avformat_find_stream_info(pFmtCtx, NULL);


// avformat_find_stream_info

// 1, AVFormatContext 객체 사용

// 2, Codec 옵션 지정  // 정보를 얻기 위한 미리 Data를 Decode해야 되는 경우

// 임시로 생성할 Codec을 넘겨줄 Codec 옵션을 지정 대부분 NULL

// ** avformat_find_stream_info blocking 함수 (Input Source로 Network Protocol 사용시)

// 패킷이 발견될때까지 Read하기 때문에 시간이 지연되거나, 최악의 경우 패킷이 들어오지않으면

// block 되어버리는 일이 발생할 수 있다.


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");



// Get Stream Duration 


if (pFmtCtx->duration > 0)

{


// Dev-C++ 에서는 long long 타입 정상적으로 작동 하지않음 

// __int64 vc 에서만 쓰는 자료형 

// __int64 nn1 = 2147483647ll;

// __int64 nn2 = -2147483648ll;

// __int64 vv = 100ll;

// __int64 rr1 = nn1+vv;

// __int64 rr2 = nn2 -vv;

// size_t t1 = sizeof(long long int);

// size_t t2 = sizeof(__int64)

// long long int r1 = 

int tns, thh, tmm, tss;

// duration 값을 받았을 경우에 롱롱 타입으로(64bit) 32bit일경우에는 롱롱 타입이 지원되지않음 유의바람! 빠셍

// 

tns = pFmtCtx->duration / 1000000LL;

thh = tns / 3600;

tmm = (tns % 3600) / 60;

tss = (tns % 60);


if (tns > 0) {

av_log(NULL, AV_LOG_INFO, "Duration : %2d:%02d:%02d\n", thh, tmm, tss);

// av_log(NULL, AV_LOG_INFO, "Duration : duration %d  thh : %d \n ", pFmtCtx->duration, thh);

}


}



// 일반적인 미디어의 스트림은 Video 와 Audio 로 나누어져 있으며 두가지의 각각 스트림이 인코딩 -> 먹싱 -> 미디어 

// 미디어의 역활은 반대로 -> 디먹싱 -> 디코딩 -> Video,Audio  Source로 나타나게 된다. 

// 영상 편집 어플리케이션의경우  디먹싱 과정에서 나타나는 Elements들을 제어해서 편집을 하는 경우가 대다수 


av_log(NULL, AV_LOG_INFO, "Number of Stream: %d\n", pFmtCtx->nb_streams);


// print Stream Information


int i;

for (i = 0; i < pFmtCtx->nb_streams; i++) {

AVStream *pStream = pFmtCtx->streams[i];

const char *szType = AVMediaType2Str(pStream->codec->codec_type);

const char *szCodecName = AVCodecID2Str(pStream->codec->codec_id);

av_log(NULL, AV_LOG_INFO, "    > Stream[%d]: %s: %s ", i, szType, szCodecName);

if (pStream->codec->codec_type == AVMEDIA_TYPE_VIDEO) {

av_log(NULL, AV_LOG_INFO, "%dx%d (%.2f fps)", pStream->codec->width, pStream->codec->height, av_q2d(pStream->r_frame_rate));

}

else if (pStream->codec->codec_type == AVMEDIA_TYPE_AUDIO) {

av_log(NULL, AV_LOG_INFO, "%d Hz", pStream->codec->sample_rate);

}

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

}






// Close an opened input AVFormatContext

avformat_close_input(&pFmtCtx);

// avformat_close_input 

// avformat_open_input 혹은 avformat_alloc_context()

// 함수를 통해서 할당된 AVFormatContext 객체 S를 해제까지 해준다. 따로 free가 필요없다.



// Undo the initialization done by avformat_network_init

avformat_network_deinit();





return 0;



}


이상태로 돌리게 되면 함수 2개가 선언이 안되어있어서 빨간 줄이 갈텐데 

const char *AVMediaType2Str(AVMediaType type);

const char *AVCodecID2Str(AVCodecID id);

함수는 .txt로 첨부 한다. 

AvMediaType2Str_AvCodecID2str_Method.txt



'개발일지(Platform & Library) > ffmpeg' 카테고리의 다른 글

미디어 파일의 기초  (0) 2016.06.14
ffmpeg 준비 및 환경 설정(Windows)  (0) 2016.06.14

+ Recent posts