您能否根据返回确定 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 是不是正确执行?的主要内容,如果未能解决你的问题,请参考以下文章

您能否确定是不是可以使用 discord.py 直接向用户发送消息?

ffmpeg:哪些文件格式支持标准输入?

C# 和 FFmpeg 最好没有 shell 命令?

Python 中的 Redshift 连接单元测试

graphql 查询或突变能否返回标量值

您能否根据 around_action 过滤器中的 yield 块内发生的情况有条件地显示一条 Flash 消息?