为什么 FFmpeg 要解码原始 YUV420p 视频?

为什么 FFmpeg 要解码原始 YUV420p 视频?

为什么 FFmpeg 以 YUV420 平面 8 位像素格式解码原始视频,而它也使用相同的 YUV420p 像素格式对视频进行编码?

我使用 FreeScale PowerPC 上的 MPEG2 编码器对仅编码原始 YUV420p 视频进行了几个基准测试,使用以下设置:

ffmpeg -f rawvideo -pix_fmt yuv420p -s cif -r 25 -i YUV420p_cif.yuv -vcodec mpeg2video -pix_fmt yuv420p -r 25 -g 25 -s cif -b:v 1024k Output.mp4

视频片段长达 15 分钟。我发现整个过程使用了:

  • 3.9% 的时间用于读取文件;
  • 3.7% 的时间用于解码;
  • 91.2% 的时间用于编码;
  • 0.7% 的时间用于多路复用 + 写入文件;
  • 0.5% 的时间用于初始化/关闭 ffmpeg

整个过程耗时 382 秒(58.9 fps),因此解码总共耗时 14.1 秒。这对我来说似乎很长!

既然编码过程使用的是 YUV420p 像素格式,为什么 FFmpeg 需要 3.7% 的时间将原始 YUV420p 解码为相同格式?

答案1

为了对视频进行编码,您仍然必须以内部格式获取每帧的数据,然后将其输入到编码器。

AVFrame用于内部表示帧,它可以采用您想要的任何像素格式 - 您只需正确分配它。

这就是为什么解码需要 CPU 时间,即使你的输入和输出像素格式相同:你需要为每个帧分配内存,读取它(即使它是原始数据),然后将此帧传递给编码器。编码和解码处理方式的示例可以在这里看到

相关内容