我正在将 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 库。
最佳答案
问题是这个函数:
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/