使用ffprobe

使用ffprobe

我正在尝试使用以下命令获取视频的分辨率:

ffmpeg -i filename.mp4

我得到了一个很长的输出,但我只需要 bash 脚本的宽度和高度。我应该如何过滤掉这些参数?也许有更好的方法。

答案1

使用ffprobe

例如:

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

输出格式:

1280x720

其他输出格式选择的示例

参见-of选项文档以获得更多选择和选项。另请参阅FFprobe 提示其他示例包括持续时间和帧速率。

默认无[STREAM]包装

ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1 input.mp4

输出格式:

width=1280
height=720

默认无密钥

ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1:nk=1 input.mp4

输出格式:

1280
720

CSV

ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4

输出格式:

1280,720

JSON

ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of json input.mp4

输出格式:

{
    "programs": [

    ],
    "streams": [
        {
            "width": 1280,
            "height": 720
        }
    ]
}

XML

ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of xml input.mp4

输出格式:

<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
    <programs>
    </programs>

    <streams>
        <stream width="1280" height="720"/>
    </streams>
</ffprobe>

答案2

以下命令完全依赖于ffmpeg(和grepcut)来获取所需的高度或宽度:

宽度:

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f1

1280

高度:

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f2

720

两者的区别仅仅-f在于参数cut

如果您更喜欢完整的分辨率字符串,则不需要cut

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}'

1280x720

以下是我们使用这些命令所要做的事情:

  1. 运行ffmpeg -i以获取文件信息。
  2. 提取仅包含信息的行Video:
  3. digitsxdigits仅提取看起来介于 3 到 5 个字符之间的字符串。
  4. 对于前两种,剪切掉 之前或 之后的文本x

答案3

输出ffprobe如下所示:

streams_stream_0_width=1280
streams_stream_0_height=720

从技术上讲,您可以使用eval 将它们分配给bash变量,但这不是必需的并且可能不安全;有关更多信息,请参见此处:

https://stackoverflow.com/questions/17529220/why-should-eval-be-avoided-in-bash-and-what-should-i-use-instead

相反,由于您正在使用bash,因此请利用其内置数组和字符串操作:

filepath="filename.mp4"
width_prefix='streams_stream_0_width='
height_prefix='streams_stream_0_height='
declare -a dimensions
while read -r line
do
    dimensions+=( "${line}" )
done < <( ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height "${filepath}" )
width_with_prefix=${dimensions[0]}
height_with_prefix=${dimensions[1]}
width=${width_with_prefix#${width_prefix}}
height=${height_with_prefix#${height_prefix}}
printf "%s\t%sx%s\n" "${filepath}" "${width}" "${height}"

答案4

使用grep仅选择您要查找的行。将输出从 STDERR 重定向到 STDOUT,因为 ffmpeg 会将所有信息输出到那里。

ffmpeg -i filename.mp4 2>&1 | grep <keyword>

编辑:使用 perl 的完整工作示例:

$ ffmpeg -i MVI_7372.AVI 2>&1 | grep Video | perl -wle 'while(<>){ $_ =~ /.*?(\d+x\d+).*/; print $1 }'
640x480

相关内容