搞IT都三年了,都沒有好好的寫過一篇博客,從現(xiàn)在開始,有時(shí)間就要寫點(diǎn)東西吧,也算是對(duì)過往工作學(xué)習(xí)的總結(jié)吧。
言歸正傳,進(jìn)入主題,這幾天由于工作的需要,要要就ffmpeg,并且一直到Android平臺(tái)上。
由于本人從來沒有接觸過ffmpeg,剛開始就頭大。不過之后慢慢的看了一些ffmpeg大神們的文章和博客就慢慢的懂了一些,那現(xiàn)在就把自己學(xué)習(xí)的過程總結(jié)一下吧:
ffmpeg體系非常龐大,一不小心就會(huì)云里霧里,還是要小心為妙。
在window下,可以去官網(wǎng)下載已經(jīng)編碼好的庫(kù),然后可以嘗試手動(dòng)去玩一玩這些庫(kù),可能用到的最多就兩個(gè)ffmpeg(格式方面的)和ffplay(播放方面的),反正不要錢,去玩一玩吧。
好吧,還是讓我們?nèi)タ匆幌略创a吧:
首先?av_register_all();//將所有該注冊(cè)類和結(jié)構(gòu)體進(jìn)行注冊(cè)。
AVFormatContext*pFormatCtx =?avformat_alloc_context();//獲取一個(gè)全局的結(jié)構(gòu)體,很多地方都會(huì)用到
avformat_open_input(&pFormatCtx,filepath,NULL,NULL);//打開視頻文件,第二個(gè)參數(shù)就是視頻文件路徑。返回值是int,0表示打開成功。pFormatCtx里面存有視頻流信息
avformat_find_stream_info(pFormatCtx,NULL);//檢查一下是否有視頻流,是否可用,返回值是int,小于0,表示沒有視頻流或是視頻流不可用。
int videoindex=-1;
for(i=0; inb_streams; i++)
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){
videoindex=i;
break;
}
if(videoindex==-1){
printf("Didn't find a video stream.\n");
return -1;
} //遍歷視頻流信息,找到對(duì)應(yīng)視頻流的索引
AVCodecContext*pCodecCtx=pFormatCtx->streams[videoindex]->codec;通過對(duì)應(yīng)的索引找到對(duì)應(yīng)的解碼結(jié)構(gòu)體信息
AVCodec*pCodec=avcodec_find_decoder(pCodecCtx->codec_id);//通過對(duì)應(yīng)的ID好知道解碼器。
avcodec_open2(pCodecCtx, pCodec,NULL);//視頻解碼
av_read_frame(pFormatCtx, packet);//讀取每一幀數(shù)據(jù)
avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);//將壓縮的數(shù)據(jù)解碼,還原成YUV或是RGB數(shù)據(jù)。
基本流程就是這樣,忘記說明了,av_read_frame(pFormatCtx, packet);是個(gè)循環(huán)操作。
其實(shí)這個(gè)我也是查看雷宵驊大神們文章和demo,自我總結(jié)的,demo下載地址:http://sourceforge.NET/projects/simplestffmpegplayer/;貌似github是也是有的,大家可以去找一下。
希望大家多多包涵,多多指正。有時(shí)間再講移植到Android編譯情況吧。