将 ffmpeg 结果重定向到另一个文件

Redirecting ffmpeg result into another file

我正在尝试使用 ffmpeg 获取输入视频的大小,下面是我使用的代码,我想要做的是首先将结果存储到一个 txt 文件中,然后进行一些解析获取视频的大小:

$ ffmpeg -i TheNorth.mp4 

终端显示"At least one output file must be specified" 然后我试了这个:

$ ffmpeg -i TheNorth.mp4 result.txt

终端显示"Unable to find a suitable output format for 'size.txt'"

那么如何获取结果并保存到指定的文件中呢?

您可以使用管道存储 ffmpeg 生成的输出:

ffmpeg -i TheNorth.mp4 2> result.txt

你需要在这里使用 2>,因为 ffmpeg 写入 StdErr(而不是 StdOut)。

更好的办法是使用 ffprobe

ffprobe -show_format -print_format json TheNorth.mp4

这将输出有关视频的 JSON 格式信息。我猜它比原始输出更容易解析。要将输出重定向到文件,只需使用普通管道 > result.txt 类似于已接受的答案,但没有两个。

ff探测器

如果您只想获取视频的大小,那么您可以直接使用 ffprobe 获取视频大小和其他信息。这将避免重定向、临时输出文件和额外的解析。

$ ffprobe -v error -select_streams v:0 -show_entries stream=height,width -of csv=p=0:s=x input.mkv 
  1280x720

有关更多示例,请参阅 FFmpeg Wiki: FFprobe Tips

三通

对于想要编码和捕获结果控制台输出的用户,我建议使用 tee。纯重定向的问题是错误信息、失败、提示等重要信息可能会被遗漏。

您可以通过包含 tee 以在控制台中显示输出并将其保存到文件中来避免这种情况:

ffmpeg -i input … output |& tee console.txt

ffmpeg 输出到 stderr 而不是更典型的 stdout,因此 & 被添加到 | 管道来处理这个问题。这仅适用于 Bash 4+。如果您使用的是其他东西,则将 |& 更改为 2>&1,这会在将 stderr 发送到管道之前将其重定向到 stdout。