我正在将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库。
答案 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