使用 ffmpeg 获取视频信息 - 为啥我需要指定输出文件?
Posted
技术标签:
【中文标题】使用 ffmpeg 获取视频信息 - 为啥我需要指定输出文件?【英文标题】:Using ffmpeg to get video info - why do I need to specify an output file?使用 ffmpeg 获取视频信息 - 为什么我需要指定输出文件? 【发布时间】:2012-07-09 03:47:53 【问题描述】:我正在使用 ffmpeg 获取有关视频文件的信息,但我不想将信息保存到文件中。 ffmpeg 正在返回所有视频信息,但它作为错误返回,因为我没有指定输出文件。我正在使用的命令是:
ffmpeg -i C:\Test\3FA8D0E6-BD61-D160-98BB41304D63FAE3.mp4
我得到的错误是“必须指定至少一个输出文件”
我在 ColdFusion 中使用 <cfexecute>
调用它,输出存储在一个局部变量中,这就是我不想指定文件的原因...我只是不需要存储这个在一个文件中。
如果有什么不同,我会在 Windows 上运行它。
【问题讨论】:
好吧,它真的有输出吗?如果没有,给它一个输出参数,也许这就是它通过调用验证所需的全部内容。 如果 ffmpeg 需要它,那么我猜你必须忍受它。我会在 CF 中创建一个临时文件名,将其传递给 ffmpeg,读取它,然后将其删除。 你能展示你的 ColdFusion 代码吗?或者至少是它的相关部分? 我在 ffmpeg stdout 上进行了搜索,并找到了结果。你想用那个。这是一个例子:superuser.com/questions/322216/… 使用 ffmpeg 而不指定输出文件导致它给出了一个错误,因为 FFmpeg 要求指定一个输出文件。仅仅使用它来获取有关文件的信息并不是它的预期用途。
选项1:忽略错误。 FFmpeg会先打印文件信息,这样你就可以简单的得到你需要的信息而忽略错误。
选项 2:改用ffprobe。 FFprobe 是另一种通常与 FFmpeg 一起打包的工具,旨在获取有关媒体文件的信息。它甚至可以以各种易于解析的格式输出信息,因此您不必为解析 FFmpeg 的输出而烦恼。
【讨论】:
使用 ffprobe 是要走的路。我将结果作为 JSON 输出,然后将它们反序列化为本地冷融合结构。很漂亮。 是的,ffprobe 的用处还不够广为人知。 也许 ffmpeg 中的错误消息可以更改为建议。 这是您使用 ffProbe 的方式:ffprobe -v quiet -print_format json -show_format -show_streams -print_format json "C:\Files\somefile.asf"
或获取 XML:ffprobe -v quiet -print_format json -show_format -show_streams -print_format xml "C:\Files\somefile.asf"
。这将帮助人们入门,因为文档看起来很混乱......【参考方案2】:
我最终改用 ffprobe。这是我的 ColdFusion 测试代码......请记住,这可以写得更好。在这一点上,我只对宽度/高度/持续时间感兴趣。
<cfset fsVideoFile = "C:\videos\test.mp4">
<cfset width = 270>
<cfset height = 480>
<cfset duration = 0>
<cfexecute
name="ffmpeg\bin\ffprobe.exe"
arguments="#fsVideoFile# -v quiet -print_format json -show_format -show_streams"
timeout="60"
variable="jsonInfo"
errorVariable="errorOut" />
<cfif IsJSON (jsonInfo)>
<cfset videoInfo = DeserializeJSON (jsonInfo)>
<cfdump var="#videoInfo#">
<cfset duration = videoInfo.format.duration>
<cfloop array="#videoInfo.streams#" index="stream">
<cfif stream.codec_type EQ "video">
<cfset width = stream.width>
<cfset height = stream.height>
<cfbreak />
</cfif>
</cfloop>
</cfif>
【讨论】:
【参考方案3】:很晚了,但如果他不想使用ffprobe
,希望它可以帮助某人(请参阅@blahdiblah answer)。
您可以将Null
与ffmpeg
一起使用,如in the documentation 所述:
ffmpeg -i C:\Test\3FA8D0E6-BD61-D160-98BB41304D63FAE3.mp4 -f null -
【讨论】:
这可能需要很长时间,因为它会启动整个文件的解码。与ffmpeg -i input.mp4
相比没有实际优势。
@llogan ffmpeg -i input.mp4
命令的退出代码不会是 0
,如果您需要以干净的方式(使用 ffmpeg
)获取媒体信息,例如有时在Shell/批处理脚本【参考方案4】:
使用 ffmpeg 可以做到这一点,如果您不想将信息保存到文件中,您可以将其发送到 *nix 系统中的/dev/null
。
ffmpeg -i file.mp4 -hide_banner -f null /dev/null
【讨论】:
以上是关于使用 ffmpeg 获取视频信息 - 为啥我需要指定输出文件?的主要内容,如果未能解决你的问题,请参考以下文章