最新版ffmpeg 提取视频关键帧
生活随笔
收集整理的這篇文章主要介紹了
最新版ffmpeg 提取视频关键帧
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(如果有轉載的請注明哈)
對于ffmpeg的配置請看我的上篇博客:http://blog.csdn.net/kuaile123/article/details/11367309
所用視頻為 flv格式的,用的vs2010,電腦為64位,下面的也是64位,別下錯了。
因為ffmpeg的函數和版本有關系,這里記錄下我所用的整合的版本,是昨天下的最新版的,需要請下載
http://download.csdn.net/detail/kuaile123/6232827(因為博主沒有積分可用了,所以需要積分)
32位的請去官網下載。
從網上找到的都是舊版本的函數,函數的講解可用直接自己看里面include中的.h文件,自己根據新版的文件自己弄出來的。
需要用到libavformat 用來處理解析視頻文件并將包含在其中的流分離出來, 而libavcodec 則處理原始音頻和視頻流的解碼
還是上代碼:
完整的代碼下載:http://download.csdn.net/detail/kuaile123/6232905
//注冊庫中含有的所有可用的文件格式和編碼器,這樣當打開一個文件時,它們才能夠自動選擇相應的文件格式和編碼器。av_register_all();int ret;// 打開視頻文件if((ret=avformat_open_input(&pInputFormatContext, sourceFile, NULL, NULL))!=0){cout<<" can't open file "<<endl;return -1;}// 取出文件流信息if(avformat_find_stream_info(pInputFormatContext,NULL)<0){ cout<<" can't find suitable codec parameters"<<endl;return -1;}//用于診斷 //產品中不可用//dump_format(pInputFormatContext, 0, sourceFile, false);//僅僅處理視頻流//只簡單處理我們發現的第一個視頻流// 尋找第一個視頻流int videoIndex = -1;for(int i=0; i<pInputFormatContext->nb_streams; i++) {if(pInputFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){videoIndex = i;break;}} if(-1 == videoIndex){cout<<" can't find video stream !"<<endl;return -1;}// 得到視頻流編碼上下文的指針pInputCodecContext = pInputFormatContext->streams[videoIndex]->codec; // 尋找視頻流的解碼器pInputCodec = avcodec_find_decoder(pInputCodecContext->codec_id); if(NULL == pInputCodec){cout<<"can't decode "<<endl;return -1;}// 通知解碼器我們能夠處理截斷的bit流,bit流幀邊界可以在包中//視頻流中的數據是被分割放入包中的。因為每個視頻幀的數據的大小是可變的,//那么兩幀之間的邊界就不一定剛好是包的邊界。這里,我們告知解碼器我們可以處理bit流。if(pInputCodec->capabilities & CODEC_CAP_TRUNCATED){pInputCodecContext->flags|=CODEC_FLAG_TRUNCATED;}//打開解碼器if(avcodec_open2(pInputCodecContext, pInputCodec,NULL) != 0) {cout<<"decode error"<<endl;return -1;}int videoHeight;int videoWidth;videoWidth = pInputCodecContext->width;videoHeight = pInputCodecContext->height; AVPacket InPack;int len = 0;AVFrame OutFrame;int nComplete=0;
int nFrame = 0;AVRational avRation = pInputCodecContext->time_base;float frameRate = (float)avRation.den/avRation.num;//av_seek_frame(pInputFormatContext,0);while((av_read_frame(pInputFormatContext, &InPack) >= 0)){len = avcodec_decode_video2(pInputCodecContext, &OutFrame, &nComplete, &InPack); //判斷是否是關鍵幀if(nComplete > 0 && OutFrame.key_frame){ //解碼一幀成功SaveBmp(pInputCodecContext, &OutFrame, videoWidth, videoHeight,nFrame); nFrame++;}}cout<<" save frame number: "<<nFrame<<endl;avcodec_close(pInputCodecContext); av_free(pInputFormatContext);
保存為bmp格式,保存函數如下:
?
總結
以上是生活随笔為你收集整理的最新版ffmpeg 提取视频关键帧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ 调用 ffmpeg 编程
- 下一篇: c++ DirectShow播放任意格式