如何使用 ffmpeg 将视频中包含 1 个静态图像(带声音)的 .avi 视频转换为 mp4 视频并保持最小尺寸?

如何使用 ffmpeg 将视频中包含 1 个静态图像(带声音)的 .avi 视频转换为 mp4 视频并保持最小尺寸?

我有一个 .avi 视频 (divx),帧率为 25fps,其 mp3 音频为 64kbit/s。此视频整个过程中只有一张图片。

我正在尝试将该视频转换为 mp4,但要使其尽可能小(因为实际上只有 1 帧!)

我目前正在尝试这个:

ffmpeg -i video.avi -vcodec libx264 -acodec aac \
-ar 32000 -ab 64k -ac 2 -strict -2 -y video.mp4

但这会使 mp4 视频的大小与 .avi 相似。

接下来我尝试将帧速率改为 1fps:

ffmpeg -i video.avi -vcodec libx264 -acodec aac \
-ar 32000 -ab 64k -ac 2 -strict -2 -y -r 1 video.mp4

这使得视频文件变得更小(缩小了 10 倍),但有一个问题,即关键帧不会出现在视频的第一帧。因此,视频中唯一的帧出现在视频中的第 8 或 10 秒左右(!)。

看起来这里的问题是 ffmpeg 不断从 video.avi 中丢帧,并且它没有将它们作为关键帧写入 video.mp4。当它确实写入关键帧时,它已经晚了。

它尝试使用-force_key_frames参数,但也没有帮助。我照做-force_key_frames 0-force_key_frames 1

有谁知道如何才能制作仅含 1 个静态帧的非常小的 mp4 视频?

答案1

您应该通过分离 A/V 组件来检查视频部分是否真的是一个因素

使用 ffmpeg 可以实现

#retrieve audio-only
ffmpeg -i <<VideoName>> -vn -acodec copy -f <<AudioCodec>> output.audio
#retrieve video-only
ffmpeg -i <<VideoName>> -an -vcodec copy -f <<VideoCodec>> output.video

如果视频的尺寸确实很大,一种可能性是创建它的屏幕截图,并将图像用作视频编码器的输入,而不是重新编码视频流

ffmpeg.org/wiki以供参考

#create screenshot from video
ffmpeg -i <<VideoName>> -ss 00:00:01.0 -f image2 -vframes 1 output.screen.png

您可以看到在这个 stackoverflow-post 上如何用静态照片制作视频

答案2

尝试以下命令,分别删除图像和音频,然后重新组合:

ffmpeg -loop 1 -shortest -y -i image.jpg -i audio.amr -acodec copy \
-vcodec video.avi video.mp4

答案3

如果您只是想转换它,请使用名为 Format factory 的程序(链接在此处:http://www.pcfreetime.com/)它可以直接将文件转换为 mp4,你可以将其设置为小尺寸

相关内容