sws_scale以较小的x264 mp4编码拧紧最后一个像素行

时间:2012-07-20 13:41:00

标签: 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库。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

问题在于这个功能:

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

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

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