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

ffmpeg으로 미디어 플레이어를 만들기 전에 기본적인 미디어의 만들어지는 과정을 좀 대충 공부를 해야된다.



일단


Video Source -> Video Encoder -> Video Element

-> Muxer(Muxing)먹싱 작업 -> Media

Audio Source -> Audio Encoder -> Audio Element 




Muxing -> MultiPlexing의 약자 


1. 가공되지 않은 원본소리 (Video/Audio Source) -> Encoding 과정 -> 결과물(Video / Audio Elements)

* Encoder -> Encoder + Decoder = Codec(H.264, H.265 HEVC)

가공되지 않은 원본의 크기가 너무 크기 때문에 인코딩 과정을 거쳐야 한다. 


결과물이 나왔을 시에 (Elements) 결과물을 담기 위한 상자가 필요하다 = Container(.avi , .mkv, .ts 등등)


컨테이너 포맷과 코덱은 다른것이다. mp4에는 h.264를 권장 (컨테이너 = mp4 코덱 = h.264)


그럼 여기서 플레이어가 해주는일은 뭔가 


-> Video Element -> Video Decoder -> Video Source

Media -> Demuxer(Demuxing) 

-> Audio Element -> Audio Decoder -> Audio Source


1. 디먹싱 과정의 각각의 Elements들을 하나씩 꺼냄


2. 컨테이너(.mp4, avi 드에서 꺼낸) Elements을 디코더에 의해 디코딩 진행 -> 각각 원본 영상 및 소리로 변환


3. 이 단계에서 후처리 가능 (소리 보정 왜곡)


4. 영상과 소리를 시간에 맞게 잘 동기화하여서 화면 혹은 스피커로 출력 -> 소리시간에 맞추어 영상을 출력해주는 동기화 방법이 가장 많이 사용 된다.


이중 ffmpeeg 의 역할은 출력을 제외한 모든 과정 


을 뜻하게 된다. 




지금은 좀 미뤄 줬지만

ffmpeg 과 GUI 크로스플랫폼 (qt 등)을 이용하여서 멀티미디어 를 하나 제작해 볼까 한다.



우선 ffmpeg을 Windows 버전에서 사용해볼라 한다. 어차피 ffmpeg소스야 어디서든 똑같이 돌아가기에


문제는 없다.


//Windows 버전 Build 용 ffmpeg을 다운로드 한다.



https://ffmpeg.zeranoe.com/builds/ // ffmpeg 다운 // dev 버전과 shared 버전 다운로드 bin , include, lib 폴더만 따로 압축 풀기


1. win32-dev 파일에서는 include / lib 만 풀고


2. win32-shared 파일에서는 bin 폴더만 압축을 푼다. 


3. D:\ffmpeg 폴더를 하나 생성후 3개의 폴더를 넣어 놓는다.

이런식으로 



혹시 visual studio 2013 버전 이하라면 inttypes.h 파일을 추가해주어야 한다. 


// 다운로드 경로 https://code.google.com/p/msinttypes/


관련 정보는 


// 정보 공유 

http://trac.ffmpeg.org/wiki // 위키 


http://www.ffmpeg.org //공홈



64bit을 받았을시에


구성관리자 -> 활성 솔루션 플랫폼 -> 새로 추가하기 x64(새로운 프로젝트 생성 체크 해제) -> Visual Studio 에서 


프로젝트 플랫폼 x64로 새로 추가한다. (Visual Studio 2013 프리미엄 기준) Windows



1.   구성관리자 -> 

2. -> 활성 솔루션 플랫폼 -> 새로 만들기 -> 

3. -> 새 플랫폼 선택 x64 선택후 추가 


4. 프로젝트 플랫폼도 새로만들기 하여 64를 추가 해주어야 한다. 




여기까지 한 후에 Alt + F7 


1. 구성 속성 디버깅 -> 환경 : PATH=%PATH%;$폴더위치/bin  

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


2. C/C++  추가 포함 디렉터리 (Additional Directory ) 


-> "D:\ffmpeg\include"


3. 링커    추가 라이브러리 디렉터리 


-> "D:\ffmpeg\lib"



여기까지 설정이 되었다면 ffmpeg을 windows 에서 build하기 위한 준비를 모두 끝났다고 보면 된다. 



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

ffmpeg의 시작 (파일 분석)  (0) 2016.06.14
미디어 파일의 기초  (0) 2016.06.14

+ Recent posts