搞IT都三年了合搅,都沒有好好的寫過一篇博客多搀,從現(xiàn)在開始,有時間就要寫點東西吧灾部,也算是對過往工作學(xué)習(xí)的總結(jié)吧酗昼。
言歸正傳,進入主題梳猪,這幾天由于工作的需要麻削,要要就ffmpeg,并且一直到Android平臺上春弥。
由于本人從來沒有接觸過ffmpeg呛哟,剛開始就頭大。不過之后慢慢的看了一些ffmpeg大神們的文章和博客就慢慢的懂了一些匿沛,那現(xiàn)在就把自己學(xué)習(xí)的過程總結(jié)一下吧:
ffmpeg體系非常龐大扫责,一不小心就會云里霧里,還是要小心為妙逃呼。
在window下鳖孤,可以去官網(wǎng)下載已經(jīng)編碼好的庫,然后可以嘗試手動去玩一玩這些庫抡笼,可能用到的最多就兩個ffmpeg(格式方面的)和ffplay(播放方面的)苏揣,反正不要錢,去玩一玩吧推姻。
好吧平匈,還是讓我們?nèi)タ匆幌略创a吧:
首先?av_register_all();//將所有該注冊類和結(jié)構(gòu)體進行注冊。
AVFormatContext*pFormatCtx =?avformat_alloc_context();//獲取一個全局的結(jié)構(gòu)體藏古,很多地方都會用到
avformat_open_input(&pFormatCtx,filepath,NULL,NULL);//打開視頻文件增炭,第二個參數(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;
} //遍歷視頻流信息饲嗽,找到對應(yīng)視頻流的索引
AVCodecContext*pCodecCtx=pFormatCtx->streams[videoindex]->codec;通過對應(yīng)的索引找到對應(yīng)的解碼結(jié)構(gòu)體信息
AVCodec*pCodec=avcodec_find_decoder(pCodecCtx->codec_id);//通過對應(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);是個循環(huán)操作尽狠。
其實這個我也是查看雷宵驊大神們文章和demo,自我總結(jié)的叶圃,demo下載地址:http://sourceforge.NET/projects/simplestffmpegplayer/袄膏;貌似github是也是有的,大家可以去找一下掺冠。
希望大家多多包涵沉馆,多多指正。有時間再講移植到Android編譯情況吧德崭。