使用 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 而不指定输出文件导致 将输出放入“errorVariable”参数而不是“variable”参数。我尝试将“info.txt”指定为输出文件,但 ffmpeg 也不喜欢这样。我本可以解析 errorVariable 输出,但我发现 ffprobe 工作得更好,因为我可以将输出作为 JSON 并使用 DeserializeJSON () 将其解析为原生 CF 结构。 (见下面我的回答)。谢谢大家! 【参考方案1】:

它给出了一个错误,因为 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)。

您可以将Nullffmpeg 一起使用,如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 获取视频信息 - 为啥我需要指定输出文件?的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg音视频开发: 使用ffprobe获取媒体信息

使用ffmpeg libavcodec将视频流编码为H264,为啥持续时间为零

FFmpeg常用命令合集

FFmpeg常用命令合集

FFmpeg常用命令合集

FFMpeg SDK使用7调用FFmpeg SDK实现视频水印