encoding - sws_scale 在较小的 x264 mp4 编码中搞砸了最后一个像素行

标签 encoding ffmpeg libavcodec libavformat libav

我正在将 PIX_FMT_ARGB 格式的图片混合到 mp4 视频中。

所有这些都运行良好,除了输出图像的最后一个像素行被搞砸了,在大多数情况下,最后一行是全黑的,有时还有其他颜色,它似乎在某种程度上取决于它运行的机器。

我绝对确定错误一定是在 sws_scale 中,因为我正在保存缩放前后的图像。输入图像没有错误,但在 sws_scale() 之后我保存 yuv 图像,错误很明显。

这是一个例子:

原创

enter image description here

Yuvfile(sws_scale 之后)

enter image description here

在 Yuvfile 的底部,您将看到黑行。

这就是我进行缩放的方法(或多或少是在官方 ffmpeg 示例之后):

static int sws_flags = SWS_FAST_BILINEAR | SWS_ACCURATE_RND;

if (img_convert_ctx == NULL)
{
   img_convert_ctx = sws_getContext( srcWidth, srcHeight,
           PIX_FMT_ARGB,
           codecContext->width, codecContext->height,
           codecContext->pix_fmt,
           sws_flags, NULL, NULL, NULL );
   if (img_convert_ctx == NULL)
   {
      av_log(c, AV_LOG_ERROR, "%s","Cannot initialize the conversion context\n");
      exit(1);
   }
}
fill_image(tmp_picture, pic, pic_size, frame_count, ptr->srcWidth, ptr->srcHeight );

sws_scale(img_convert_ctx, tmp_picture->data, tmp_picture->linesize,
        0, srcHeight, picture->data, picture->linesize);

我还尝试了许多不同的 SWS_ 标志,但都产生相同的结果。

这可能是 sws_scale 中的错误还是我做错了什么?我正在使用最新版本的 ffmpeg 库。

最佳答案

问题是这个函数:

fill_image(tmp_picture, pic, pic_size, frame_count, ptr->srcWidth, ptr->srcHeight );

它没有正确地将输入图像复制到 tmp_picture。确实跳过了最后一行。

士气:不要相信多年的功能:D

关于encoding - sws_scale 在较小的 x264 mp4 编码中搞砸了最后一个像素行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11580559/

相关文章:

javascript - 如何确定字符串中是否有外来字符(不是英文字母)?

ffmpeg - 在单个命令中缩放和覆盖

c++ - 使用 C++ 访问网络摄像头的 FFMPEG

java - 当我使用 bufferedReader 时如何检测编码

encoding - ffmpeg 编码图像序列

c++ - 带有 aecho 的 FFmpeg 过滤器配置无法配置所有链接和格式 - avfilter_graph_config

c++ - 使用 FFmpeg 从 IP 摄像机 (RTSP) 读取会导致 5xx 服务器错误

c++ - 使用 FFMPEG 库到 UDP 流 mpeg2 ts 视频延迟/初始连接问题

ffmpeg - 如何使用 FFMPEG 获取视频的 _current_ 持续时间? (不是元数据)

java - 为什么我的 Servlet 不响应 UTF-8 格式的 JSON 请求?