以下是针对 Windows 的类似问题:
我希望在 Mac 上解决这个问题。
我尝试过 Handbrake 和 Avidemux(后者似乎有一个选项——“shift”——来修复它,但它根本不播放音频,所以我不知道它是否有任何作用!)。
答案1
获取一份 FFmpeg。请参阅本文末尾的说明,了解如何获取 FFmpeg。
视频是否落后于音频或音频是否落后于视频,其实并不重要。基本命令如下。我们将传递两次输入,如两个-i
选项所示,然后延迟一次输入,并将它们合并在一起。
ffmpeg -i in.flv -itsoffset offset -i in.flv -map 1:0 -map 0:1 -c copy out.flv
这里,offset
是以秒为单位的延迟,例如1.5
或0.35
。此值必须是正数,因此如果您的音频落后于视频,我们将不得不偏移视频。如上例所示。同样,如果视频落后于音频,我们将不得不偏移音频。
那么,如何选择延迟音频还是视频?好吧,既然我们已经延迟了整个in.flv
,我们只需选择音频或视频流并将其与原始音频或视频流合并即可。这是在选项中完成的-map
。
基本上,map
有两个数字。冒号前面的数字指定输入文件编号(从 0 开始),第二个数字指定输入文件流(也从 0 开始)。
因此,要延迟音频,请使用以下两个选项:
-map 1:0
意思是:从第二个输入文件中取出第一个流,(视频来自原始文件)-map 0:1
意思是:从第一个输入文件中取出第二个流(来自延迟文件的音频)
如果你必须延迟视频,请将其反转:
-map 0:0
意思是:从第一个输入文件中取出第一个流(来自延迟文件的视频)-map 1:1
意思是:从第二个输入文件中取出第二个流(来自原始文件的音频)
最后,-c copy
只需告诉 FFmpeg 复制视频和音频比特流。这意味着将没有编码过程。这使得命令非常快,您甚至不会在此过程中损失任何质量。但是,如果您遇到同步错误,那么您应该退出-c copy
并让 FFmpeg 重新编码输入。
您可以通过以下方式获取最新稳定的 FFmpeg 版本自制。
打开终端并输入:
ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"
查看安装要求也一样。如果还没有,你必须安装 Xcode 的命令行工具。你需要一个 Apple ID 才能安装。
安装 Homebrew 后,安装 FFmpeg:
brew install ffmpeg
完成后,我们可以使用 FFmpeg 修复您的视频。