如何使用 FFmpeg 2 Pass 批量转换?

Posted

技术标签:

【中文标题】如何使用 FFmpeg 2 Pass 批量转换?【英文标题】:How to Batch Convert with FFmpeg 2 Pass? 【发布时间】:2017-05-31 19:17:55 【问题描述】:

我正在使用 FFmpeg 将 webm 转换为 mp4。

我的批处理文件是

cd "C:\Users\Matt\Desktop\" && for %f in (*.webm) do ffmpeg -y -i "C:\Users\Matt\Desktop\%~f" -vcodec libx264 -b:v 600K -pass 1 -acodec aac -b:a 128k "C:\Users\Matt\Desktop\%~nf.mp4" && ffmpeg -y -i "C:\Users\Matt\Desktop\" -vcodec libx264 -b:v 600K -pass 2 -acodec aac -b:a 128k "C:\Users\Matt\Desktop\%~nf.mp4"

它适用于 CRF 和 1 Pass,但使用 2 Pass 它会在第二遍时停止并给出错误:

C:\Users\Matt\Desktop" -vcodec libx264 -b:v 600K -pass 2 -acodec aac -b:a 128k C:\Users\Matt\Desktop\video:参数无效

Path 缺少第一个双引号,文件名“video 01.mp4”被截断。

【问题讨论】:

你确定第二遍中的-i参数是正确的吗?另外两次你使用它时,你已经指定了一个文件。在最后一个例子中,它似乎是一个目录 - 可能终端 \" 被解释为转义 -" @Magoo 你是对的,第二个路径缺少 %~f。解决了,谢谢。 2-pass 意思是第一遍的输出作为第二遍的输入,对吧? @aschipfl 我现在不确定。在 wiki 上,它显示了用作两个通道的输入的原始源。 trac.ffmpeg.org/wiki/Encode/H.264#twopass 啊,我明白了。你应该相信文档而不是我,我真的不知道ffmpeg,它只是我说的方式对我来说更合乎逻辑,但该工具似乎工作方式不同(我猜某处有一个临时文件保存收集的信息在第一次通过时)。很抱歉让您感到困惑! 【参考方案1】:

您的代码只能直接在 cmd 中运行,在批处理中,您必须将 for 变量的百分号加倍。 批量不需要一个衬管。 我希望这更清楚并且有效。

@Echo off
Pushd "C:\Users\Matt\Desktop\"
for %%f in (*.webm) do (
  ffmpeg -y -i "%%~f" -vcodec libx264 -b:v 600K -pass 1 -acodec aac -b:a 128k -f mp4 NUL 
  ffmpeg -y -i "%%~nf_tmp.mp4" -vcodec libx264 -b:v 600K -pass 2 -acodec aac -b:a 128k "%%~nf.mp4"
)
PopD
Pause

【讨论】:

您的文件可以正常工作,但由于某种原因最终导致 FFmpeg 崩溃,但可能是我的视频。我还尝试将代码复制粘贴到没有 .bat 文件的 CMD 中。你看到我的代码中的错误了吗? @MattMcManis 好吧,我不是 ffmpeg 专家,参数选择取决于你。 是否必须使用 %~nf_tmp.mp4 或者我可以使用与 -pass 1 %%~f 相同的输入文件作为 -pass 2 吗? @LotPings 您可以将"%%~nf_tmp.mp4" 替换为-f mp4 NUL,因为第一遍不需要输出实际文件,因此它可能会更快。在极少数情况下,我使用两遍编码我在第一遍中省略了音频,因为没有必要对它进行两次编码(你可以用-an 替换-acodec aac -b:a 128k 来做到这一点),但是通过省略它,有些人声称他们得到某种错误...我从未复制过。 @LotPings 当然。已编辑。

以上是关于如何使用 FFmpeg 2 Pass 批量转换?的主要内容,如果未能解决你的问题,请参考以下文章

适用于 Windows 的 FFMPEG 批量转换 [重复]

FFmpeg批量转换多个文件

使用python+ffmpeg批量转换格式

使用ffmpeg将.h264批量转换为.avi [重复]

在MacOS上用ffmpeg批量转换flac为mp3

ffmpeg如何批量切割视频尾部4秒?