【问题标题】:FFmpeg api generating distorted image when using 422 or 420 chroma subsampling and SD resoltuionFFmpeg api 在使用 422 或 420 色度二次采样和 SD 分辨率时生成失真图像
【发布时间】:2021-07-16 14:34:01
【问题描述】:

我创建了一个基于 FFmpeg api 的应用程序。应用程序读取视频帧,进行一些处理,然后将处理后的视频帧写入一个新文件。该应用程序在大多数情况下都可以正常工作。但是,当应用程序配置为使用具有 SD 分辨率 (720x480) 的 420 或 422 色度二次采样时,我会遇到奇怪的输出。当使用具有高清分辨率 (1920x1080) 的 420 或 422 色度二次采样时,输出结果很好。通过失真的输出,我可以看到问题出在子采样通道上。 Y 通道看起来不错,但 Cr 和 Cb 似乎失真了。

我没有在编码器中使用任何特定的编解码器选项,并且可以使用 prores 或 hevc 编解码器复制该问题。如果我输出到原始二进制视频文件,我看不到任何问题,这证实了问题在编码期间的某个时间发生,并且输入 AVFrame 的二进制数据在二次采样后格式正确。

图片如下:

Original input video

Correct output video (HD)

Distorted output video (SD)

【问题讨论】:

    标签: ffmpeg video-processing video-encoding


    【解决方案1】:

    所以看来 FFmpeg 要求您遵守一些内存对齐约束。 FFmpeg 可能会根据您使用的像素格式、高度和宽度为每行添加一些填充(请参阅 AVFrame linesize)。我解决这个问题的方法是在调用 av_frame_alloc 并设置格式、高度和宽度后提取线条大小。您想计算每行的实际数据大小(基于宽度和像素大小),然后将光标推到行大小的倍数,以便您可以阅读下一行。另一件需要注意的事情是,这种行为主要在平面格式上被注意到,而不是打包格式。

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 2022-09-27
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2013-09-28
      • 2018-09-19
      相关资源
      最近更新 更多