使用“IF”命令创建批处理文件

6
我创建了一个小批处理文件,帮助人们使用FFMPEG将MP4视频转换为FLV。这样我认识的每个人都可以简单地使用它。我认为我放置的代码行适用于每种情况(将MP4文件转换为FLV),但是几天前,它无法处理一个文件。(音频采样率过高,不适用于FLV格式)
在人们的帮助下,我找到了另一种转换代码行,但我不知道如何正确地将其整合到我的批处理文件中。
这是我现在使用的:
echo "输入文件名(不带扩展名)":set /p namefile= echo "输入要给目标文件的名称":set /p destinationfile= ffmpeg -i %namefile%.mp4 -c:v libx264 -crf 19 %destinationfile%.flv
我想添加一个“IF”语句。因为如果该行无法正常工作,则使用以下代码行:
ffmpeg -i %namefile%.mp4 -c:v libx264 -ar 22050 -crf 28 %destinationfile%.flv
我该如何做?
非常感谢您的帮助,如果我有什么不清楚的地方,请告诉我,我会尽力让它更清晰。
谢谢!

你能用简单的语言描述在 if 语句中想要测试的条件吗? - Eitan T
1
嗨,感谢@EitanT的快速回答!我不是完全确定你的问题,所以如果我错了,请告诉我!我正在寻找的条件是:“如果FFMPEG无法转换视频,则使用另一行代码。”或者,如果我们讨论最后一个视频遇到的问题,那么更好的解决方案是:“如果音频采样率不是11025、22050或44100,则使用该代码行。”我希望我回答正确了你的问题!谢谢! - John_D
我已经发布了一个答案。试试看吧... - Eitan T
2个回答

7
我不确定FFMPEG在失败时是否返回标准的错误代码,但如果有的话,您可以使用以下方法:

(译注:接下来是代码)

ffmpeg -i %namefile%.mp4 -c:v libx264 -crf 19 %destinationfile%.flv
if not errorlevel 1 goto Done
ffmpeg -i %namefile%.mp4 -c:v libx264 -ar 22050 -crf 28 %destinationfile%.flv
:Done

如果这种方法不起作用,你可以检查目标文件是否存在,以确定进一步的操作:
ffmpeg -i %namefile%.mp4 -c:v libx264 -crf 19 %destinationfile%.flv
if exist %destinationfile%.flv goto Done
ffmpeg -i %namefile%.mp4 -c:v libx264 -ar 22050 -crf 28 %destinationfile%.flv
:Done

希望这些中的一个能够起作用。

你的第一个脚本中错误逻辑被倒置了。应该写成 if not errorlevel 1 goto Done - dbenham

5
类似于EitanT的第一个解决方案,但不使用GOTO。
ffmpeg -i %namefile%.mp4 -c:v libx264 -crf 19 %destinationfile%.flv
if errorlevel 1 ffmpeg -i %namefile%.mp4 -c:v libx264 -ar 22050 -crf 28 %destinationfile%.flv

或者
编辑 - 代码被截断了,现在已经修复好了

ffmpeg -i %namefile%.mp4 -c:v libx264 -crf 19 %destinationfile%.flv||ffmpeg -i %namefile%.mp4 -c:v libx264 -ar 22050 -crf 28 %destinationfile%.flv

与EitanT的第二个解决方案类似,但不使用GOTO。
ffmpeg -i %namefile%.mp4 -c:v libx264 -crf 19 %destinationfile%.flv
if not exist %destinationfile%.flv ffmpeg -i %namefile%.mp4 -c:v libx264 -ar 22050 -crf 28 %destinationfile%.flv

@EitanT - 从技术上讲,GOTO 没有什么问题。但在批处理中,GOTO 很慢,而没有 GOTO 的代码更简单、更小。在这种情况下,速度差异微不足道,但只要逻辑保持清晰,我就喜欢尽量减少代码量。 - dbenham
当批处理涉及时,我认为性能不是问题...此外,我认为在C中,“goto Done”等同于“return”,所以对我来说实际上更清晰。但我想这是一个风格问题。 - Eitan T
@EitanT - 我同意,风格确实很重要,在这种情况下我同意性能不是个问题。但在循环内部有很多情况下,相对于没有使用GOTO或CALL的解决方案,它们可能会影响性能。但别担心,我没有关于你的回答的问题。我只是提供了一个更简洁的替代方案。顺便说一句 - 我不认为goto Done和C中的return是一样的。 在批处理中,goto Done就像在C中的goto Done一样。在批处理中,exit /b类似于C中的return - dbenham
1
快速问题...为了我的信息,因为errorlevel一直是我的一个问题。你能期望errorlevel始终为1吗?做一个if errorlevel neq 0会更好吗? - iesou
1
@iesou/John_D,if errorlevel x语句实际上是检查errorlevel是否大于或等于x。这并不直观,但这就是它的工作方式。 - Eitan T
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接