FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详解 [1]. FFmpeg编解码处理1-转码全流程简介 [2]. FFmpeg编解码处理2-编解码API详解 [3]. FFmpeg编解码处理3-视频编码 [4]. FFmpeg编解码处理4-音频编码
基于 FFmpeg 4.1 版本。
1. 转码全流程简介
看一下 FFmpeg 常规处理流程:
大流程可以划分为输入、输出、转码、播放四大块。其中转码涉及比较多的处理环节,从图中可以看出,转码功能在整个功能图中占比很大。转码的核心功能在解码和编码两个部分,但在一个可用的示例程序中,编码解码与输入输出是难以分割的。解复用器为解码器提供输入,解码器会输出原始帧,对原始帧可进行各种复杂的滤镜处理,滤镜处理后的帧经编码器生成编码帧,多路流的编码帧经复用器输出到输出文件。
1.1 解复用
从输入文件中读取编码帧,判断流类型,根据流类型将编码帧送入视频解码器或音频解码器。
av_read_frame(ictx.fmt_ctx, &ipacket); if (codec_type == AVMEDIA_TYPE_VIDEO) { transcode_video(&stream, &ipacket); } else if (codec_type == AVMEDIA_TYPE_AUDIO) { transcode_audio(&stream, &ipacket); } else { av_interleaved_write_frame(octx.fmt_ctx, &ipacket); }
1.2 解码
将视音频编码帧解码生成原始帧。后文详述。
1.3 滤镜
FFmpeg 提供多种多样的滤镜,用来处理原始帧数据。
本例中,为每个音频流/视频流使用空滤镜,即滤镜图中将 buffer 滤镜和 buffersink 滤镜直接相连。目的是:通过视频 buffersink 滤镜将视频流输出像素格式转换为编码器采用的像素格式;通过音频 abuffersink 滤镜将音频流输出声道布局转换为编码器采用的声道布局。为下一步的编码操作作好准备。如果不使用这种方法,则需要处理图像格式转换和音频重采样,从而确保进入编码器的帧是编码器支持的格式。
当然,例程可扩展,可以很容易的在 buffer 滤镜和 buffersink 滤镜中间插入其他功能滤镜,实现丰富的视音频处理功能。
滤镜的使用方法不是本实验关注的重点。详