您能否根据返回确定 FFmpeg 是不是正确执行?
Posted
技术标签:
【中文标题】您能否根据返回确定 FFmpeg 是不是正确执行?【英文标题】:Can you determine if FFmpeg executed correctly based on the return?您能否根据返回确定 FFmpeg 是否正确执行? 【发布时间】:2022-01-23 05:31:35 【问题描述】:我编写了一个脚本来批量标记一个大型音频库。标签信息存储在 Access 数据库中。我写了一个调用 FFmpeg 命令行的 vba sub。
newCmdStr = ffmpeg -i myFile.mp3 tag-info output.mp3
Shell ("cmd.exe /k " & newCmdStr)
有没有办法确定它是否正确运行?
我尝试打印退货
MsgBox(Shell(newCmdStr))
,
但它似乎返回一个随机数,我不知道该命令是否有效。
最可能的错误是文件未找到错误,但也可能存在其他问题。 如果它运行了,我会记录新文件的文件路径,如果它失败了,我会记录下来。
【问题讨论】:
我投票结束这个问题,因为“只有关于以编程方式使用 FFmpeg 库、API 或工具的问题才是主题。有关命令行工具的交互式使用的问题应该在 Super用户或视频制作。” @braX 对于使用 VBA 运行 ffmpeg 时要求以编程方式获取返回值的问题,这是一个非常糟糕的关闭原因 您可以尝试以下post中描述的解决方案。根据以下postFFmpeg 在出错的情况下返回非零状态。 (但根据评论它并不总是有效)。 【参考方案1】:Shell
异步调用命令,永远无法获得返回值。它返回进程 ID。
此外,它会返回您尝试运行的程序的程序 ID,在本例中,它是 cmd.exe
,因为这是您字符串中的第一个。
改用WScript.Shell
,它有.Run
,可以同步调用命令,或者.Exec
,它异步调用但允许获取返回值。
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("ffmpeg -i myFile.mp3 tag-info output.mp3")
Do While oExec.Status = 0
DoEvents
'You probably want to sleep here to prevent high CPU usage
'See https://***.com/a/469358/7296893
Loop
Debug.Print oExec.ExitCode
【讨论】:
我尝试遵循这个,但程序永远不会退出 oExec.Status 循环。弹出一个cmd窗口,标签为C:\Program Files\ffmpeg-4.4-full_build\bin\ffmpeg.exe,但没有显示任何文本,而且似乎没有运行任何东西。以上是关于您能否根据返回确定 FFmpeg 是不是正确执行?的主要内容,如果未能解决你的问题,请参考以下文章