将 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。
我正在尝试使用 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。