我正在尝试将视频文件剪切成小部分(0.5-5 秒),并使用 ffmpeg 将这些部分编码为 h.264/aac。我使用以下命令:
ffmpeg -i 1.avi -ss 00:05:00 -t 00:00:01,50 -vcodec libx264 -threads 0 -vpre default -acodec libfaac out1.mp4
在 VLC 中,播放某些片段时没有视频,只有声音,其他片段则有如下视频伪影:
也许我错过了 ffmpeg 的一些必要参数?
答案1
我尝试使用 FFmpeg 版本 0.8.5,使用与您一样的 AVI 输入文件。
以下命令产生了正确的结果:
ffmpeg -i 1.avi -ss 00:00:05 -t 00:00:01.50 -vcodec libx264 -vpre default -acodec libfaac out1.mp4
以下是让它发挥作用的一些技巧:
更新到FFmpeg的最新版本。
对于 Ubuntu,请按照教程在这里。我自己也一直在用它们。
在 OS X 上,安装 FFmpeg使用 Homebrew,通过调用brew install ffmpeg
。
在 Windows 上,只需下载预编译版本。
使用正确的长度格式。
请注意,持续时间格式使用小数点,而不是逗号,例如hh:mm:ss[.xxx]
。
删除该-threads 0
选项。
但是启用它却-threads 0
给我带来了错误“最终缓冲区太小”。我甚至不知道他们为什么在这里允许值为零,除非你有特殊原因,否则我只会忽略这个参数。理想情况下,它应该auto-threads
在中启用libx264
,但可能存在我不知道的错误。
不使用 B 帧进行编码。
根据输出视频的大小,我不知道是否libx264
能够使用引用一个或多个帧内编码图片的 B 图片可靠地生成输出。这甚至可能会导致您描述的瑕疵。
您可以尝试使用 禁用 B 画面(或“B 帧”)-bf 0
。