答案1
您正在使用的命令重新编码视频帧。
添加-c:v copy
以避免重新编码。
用。。。来代替ffmpeg -f mjpeg -i input.yuvj422p output_%04d.jpg
:
ffmpeg -f mjpeg -i input.yuvj422p -c:v copy output_%04d.jpg
在上下文中,“重新编码”是指将每个视频帧解码为未压缩的视频帧,然后编码(压缩)为 JPEG 图像格式。JPEG
解码和编码(重新编码)的过程是“有损的”(质量会损失),输出图像与输入视频帧不同。
FFmpeg 默认行为应用重新编码(即使输入和输出都是 JPEG 格式)。
为了避免重新编码,我们可以添加-c:v copy
参数,强制 FFmpeg 将输入流/帧按原样传递到输出(不进行解码和重新编码)。
测试:
构建合成 MJPEG 视频(用作测试输入):
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=1:duration=10 -vcodec mjpeg -pix_fmt yuvj422p -f mjpeg input.yuvj422p
input.yuvj422p的大小为51K。
将 MJPEG 转换为 JPEG 图像,无需-c:v copy
:
ffmpeg -f mjpeg -i input.yuvj422p output_%04d.jpg
10 张 JPEG 图像的总大小为 44K。
使用以下方法将 MJPEG 转换为 JPEG 图像-c:v copy
:
ffmpeg -f mjpeg -i input.yuvj422p -c:v copy output_%04d.jpg
10 张 JPEG 图像的总大小为 51K(与 input.yuvj422p 大小相同)。