如何使用 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 批量转换?的主要内容,如果未能解决你的问题,请参考以下文章