FFmpeg解码流程
得到输入文件 -> 解封格式 -> 得到编码的数据包 ->
解码数据包 -> 得到解码后的数据帧 ->
处理数据帧 -> 编码 -> 得到编码后的数据包 ->
封装格式 -> 输出文件
(1)注册所有容器格式和CODEC:av_register_all()
(2)打开文件:av_open_input_file()
(3)从文件中提取流信息:av_find_stream_info()
(4)穷举所有的流,查找其中种类为CODEC_TYPE_VIDEO
(5)查找对应的解码器:avcodec_find_decoder()
(6)打开编解码器:avcodec_open()
(7)为解码帧分配内存:avcodec_alloc_frame()
(8)不停地从码流中提取出帧数据:av_read_frame()
(9)判断帧的类型,对于视频帧调用:avcodec_decode_video()
(10)解码完后,释放解码器:avcodec_close()
(11)关闭输入文件:av_close_input_file()
FFmpeg转码流程
大流程可以划分为输入、输出、转码、播放四大块。
其中转码涉及比较多的处理环节,从图中可以看出,转码功能在整个功能图中占比很大。转码的核心功能在解码和编码两个部分,但在一个可用的示例程序中,编码解码与输入输出是难以分割的。
解复用器为解码器提供输入,解码器会输出原始帧,对原始帧可进行各种复杂的滤镜处理,滤镜处理后的帧经编码器生成编码帧,多路流的编码帧经复用器输出到输出文件。