FFmpeg 转换视频丢帧、不同步

FFmpeg 转换视频丢帧、不同步

我使用 Bandicam 和 MJPEG 编码器录制了一段视频,以获得最少的延迟。现在,我正尝试使用 ffmpeg 将这个大文件转换为 h264 avi。我知道视频流中丢帧了……前两分钟丢了 100 多帧,我猜想这只是因为 Bandicam 跟不上时丢了一些帧。因此,当我将文件转换为 h264 时,视频和音频不同步,并且随着输出视频的进行,不同步的情况似乎越来越严重。这是我在 ffmpeg 中的基本命令:

ffmpeg -i "C:\...\input.avi" -vcodec libx264 -q 5 -acodec libmp3lame -ar 44100 -ac 2 -b:a 128k "C:\...\output.avi"

我已经尝试了所有我能想到的方法,包括:

-itsoffset [-]00:00:01

在输入文件之前和之后尝试了此方法。此方法无效,因为随着视频的进展,它变得越来越不同步。

-async 1

不起作用。

-vsync 1

不起作用,但它确实显示丢失的帧被重复。

同一文件的两个输入使用 进行映射-map 0:0 -map 1:1。不起作用。

源文件播放正常。有没有什么办法可以用 ffmpeg 转换并保持音频和视频同步?谢谢。

答案1

如果它们是重复的,则可能会丢失帧,如果源播放正常,则您的问题更可能与 AVI 容器不能很好地处理 VBR 编码格式有关(特别是 h264 不能很好地与 AVI 一起播放)。我建议首先将视频转储为未压缩的 AVI 进行测试,因为它是最一致的编码格式

ffmpeg -i input.avi -acodec copy -vcodec rawvideo output.avi

然后,假设播放同步,您应该尝试直接进行编解码器复制并将源重新混合为不同的格式,即:

ffmpeg -i input.avi -acodec copy -vcodec copy output.mkv

MKV 通常可以毫无问题地处理您在其中填充的所有内容。我甚至将一些加密的 zip 文件隐藏在计算机上的各种 mkv 视频中,因为您可以在 MKV 中编码文件附件。因此,如果其中任何一个都可以正常工作且没有同步问题,那么请尝试相同的操作,但重新编码视频或音频,但只能启动其中一个并保持容器格式一致,这样您就知道问题出在哪里。即:

ffmpeg -i input.avi -acodec copy -vcodec libx264 output.mkv

或者

ffmpeg -i input.avi -acodec libmp3lame -vcodec copy output.mkv

尝试使每次测试转换尽可能简单,即不要更改比特率/采样率,使用我首先列出的示例参数。每次测试后,您都会更接近确切了解您可以做什么和不能做什么。如果您必须使用 h.264,我建议使用 mp4 容器,因为它比 avi 兼容性强得多,另一方面,如果要求是 avi 容器,那么我建议使用 wmv3 或 msvideo1 进行视频,因为它们最有可能正确编码。

答案2

几乎总是,当音频和视频不同步,并且两者之间的差异在电影播放过程中逐渐恶化时,尤其是在转换之后,问题就在于音频和视频组件的长度不同。正如在本例中观察到的那样,发生这种情况是因为视频帧丢失,但音频在转换过程中相对未受影响。

在这种情况下,最好先检查源影片,确保音频确实同步。如果同步,则对影片进行解复用,并分别处理视频和音频组件。

相关内容