1、初始化FFmpeg
av_register_all(); //初始化FFMPEG 调用了这个才能正常使用编码器和解码器
但是这个函数如今已经没什么用了,它的就是把你定义和系统初始化的编码器和解码器连接起来而已,然后就没有了。
现在解码器和编码器的初始化都是通过定义全局变量来初始化的。与原来相比,唯一的改变就是使用数组替换链表完成解码器和编码器的初始化。
2、分配一个AVFormatContext,FFMPEG所有的操作都要通过这个AVFormatContext数据结构来进行
AVFormatContext *pFormatCtx = avformat_alloc_context();
AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数。
此结构包含了一个视频流的格式内容:AVInputFormat(or AVOutputFormat同一时间AVFormatContext内只能存在其中一个),和AVStream、AVPacket这几个重要的数据结构以及一些其他的相关信息,比如title,author,copyright等。还有一些可能在编解码中会用到的信息,诸如:duration, file_size, bit_rate等。
3、打开视频文件:
char *file_path = "./movie/ifwithoutu.mp4"; avformat_open_input(&pFormatCtx, file_path, NULL, NULL);
4、视频打开之后,查找文件中的视频流
あなたがビデオストリームのタイプが見つかるまで、映像に含ま///循環流情報を探す ///が自分の記録を置く変数ビデオストリームに保存され 、我々は関係なく、彼の最初のビデオストリーム、オーディオストリームでのみ取り扱う。ここ/// = I(用0; I <pFormatCtx-> nb_streams; Iは++) { IF(pFormatCtx-> STREAMS [I] - > codec-> == codec_type AVMEDIA_TYPE_VIDEO) { ビデオストリーム= I; } } ///ビデオストリームのビデオは何の説明がなく-1が見つかった場合流れ のIF(ビデオストリームが== -1) { のprintfは( "ビデオストリームを見つけられませんでした。"); を返す-1; }
図5に示すように、ビデオストリーム、オープンデコードするデコーダ
///查找解码器 pCodecCtx = pFormatCtx->は、[ビデオストリーム】ストリーム- >コーデック。 pCodec = avcodec_find_decoder(pCodecCtx-> codec_id)。 (pCodec == NULL)場合 { のprintf( "コーデックが見つかりません。")。 -1を返します。 } ///打开解码器 (avcodec_open2(pCodecCtx、pCodec、NULL)が<0)であれば { のprintf( "オープンコーデックができませんでした。")。 -1を返します。 }
FFmpegのは、デコーダのどのような実際の使用を知らなくても、私たちが検索ビデオストリーム情報に基づいてデコーダに取得することができます
6、ビデオを読み込みます
pCodecCtx- Y_SIZE =整数> * pCodecCtx-幅>高さ; AVPacketパケット* =(AVPacket *)はmalloc(はsizeof(AVPacket)); //パケット割り当て av_new_packet(パケット、Y_SIZEを); //データパケットを割り当てる (av_read_frame場合(pFormatCtx、パケット)<0) { BREAK; //ここで上読むことビデオ }
av_read_frameビデオが読み込まれ、コンフィギュレーション・AVPacketに保存されています
図7は、ビデオ符号化データは圧縮され、それは復号化される必要があります
(パケット交換> stream_indexの==ビデオストリーム)であれば { RET = avcodec_decode_video2(pCodecCtx、PFRAME、&got_picture、パケット)。 (RET <0)であれば { のprintf( "デコードエラー")。 -1を返します。 } }
8、復号後の復号により得られた画像データをYUV420フォーマットである、文書画像として保存し、RGBフォーマットを変換する必要があります
IF(got_picture) { sws_scale(img_convert_ctx、 (uint8_t CONST * CONST *)pFrame->データ、 pFrame-> LINESIZE、 0、 pCodecCtx->高さ、 pFrameRGB->データ、 pFrameRGB-> LINESIZE
)。 }
図9に示すように、RGB画像が書き込まれます
SaveFrame(pFrameRGB、 pCodecCtx->幅、 pCodecCtx->高さ、 インデックス++
);
エラー:
(1):AV_PIX_FMT_RGB24を変更