使用ffmpeg获取视频信息 - 为什么我需要指定输出文件?

Red*_*pia 23 ffmpeg

我正在使用ffmpeg获取有关视频文件的信息,我不想将信息保存到文件中.ffmpeg返回所有视频信息,但它作为错误返回,因为我没有指定输出文件.我正在使用的命令是:

 ffmpeg -i C:\Test\3FA8D0E6-BD61-D160-98BB41304D63FAE3.mp4
Run Code Online (Sandbox Code Playgroud)

我得到的错误是"必须至少指定一个输出文件"

我在ColdFusion中调用它<cfexecute>,并且输出存储在局部变量中,这就是为什么我不想指定文件...我只是不需要将它存储在文件中.

如果它有任何区别,我在Windows上运行它.

bla*_*lah 47

它发出错误,因为FFmpeg要求指定输出文件.仅使用它来获取有关文件的信息并非其预期用途.

选项1:忽略错误. FFmpeg首先打印文件信息,这样您就可以获得所需的信息并忽略错误.

选项2:改用ffprobe. FFprobe是另一种通常与FFmpeg一起打包的工具,用于获取有关媒体文件的信息.它甚至可以以各种易于解析的格式输出信息,因此您不必为解析FFmpeg的输出而烦恼.

  • 使用 ffprobe 是要走的路。我将结果输出为 JSON,然后将它们反序列化为原生的 Coldfusion 结构。很圆滑。 (2认同)
  • 也许 ffmpeg 中的错误消息可以更改为建议这一点。 (2认同)
  • 这就是你如何使用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认同)

Red*_*pia 6

我最终使用 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>
Run Code Online (Sandbox Code Playgroud)


ale*_*mol 5

可以使用 ffmpeg 来完成此操作,如果您不想将信息保存到文件中,则可以将其发送到/dev/null*nix 系统中。

ffmpeg -i file.mp4 -hide_banner -f null /dev/null
Run Code Online (Sandbox Code Playgroud)


O.B*_*adr 5

Very late, but hopefully it can help someone if he doesn't want to use ffprobe (see @blahdiblah answer).

You can use Null with ffmpeg as stated in the documentation:

ffmpeg -i C:\Test\3FA8D0E6-BD61-D160-98BB41304D63FAE3.mp4 -f null -
Run Code Online (Sandbox Code Playgroud)

  • 这可能需要很长时间,因为它将启动整个文件的解码。与“ffmpeg -i input.mp4”相比,没有实际优势。 (6认同)
  • @llogan `ffmpeg -i input.mp4` 命令的退出代码不会是 `0`,如果您需要以干净的方式获取媒体信息(使用 `ffmpeg`),就像有时在 **Shell 中一样/批处理**脚本 (2认同)
  • @éclairevoyant:例如,像什么? (2认同)