2

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

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

我绝对确定错误必须在 sws_scale 中,因为我在缩放之前和之后保存图像。输入图像没有错误,但是在 sws_scale() 之后我保存了 yuv 图像并且错误很明显。

这是一个例子:

原来的

在此处输入图像描述

Yuvfile(在 sws_scale 之后)

在此处输入图像描述

在 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 库。

4

2 回答 2

2

问题是这个功能:

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

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

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

于 2012-07-23T12:02:05.270 回答
1

180 不是 8 的倍数,这可能是黑色行的原因。您可以尝试将其缩放到最接近的 8 倍数,例如 184 或 192(16 的倍数)吗?非 h264 编解码器需要 8 的倍数作为高度。

于 2012-07-22T05:13:36.023 回答