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);
AvMediaType2Str_AvCodecID2str_Method.txt
'개발일지(Platform & Library) > ffmpeg' 카테고리의 다른 글
미디어 파일의 기초 (0) | 2016.06.14 |
---|---|
ffmpeg 준비 및 환경 설정(Windows) (0) | 2016.06.14 |