我正在尝试使用以下命令获取视频的分辨率:
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
(和grep
和cut
)来获取所需的高度或宽度:
宽度:
$ 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
以下是我们使用这些命令所要做的事情:
- 运行
ffmpeg -i
以获取文件信息。 - 提取仅包含信息的行
Video:
。 digitsxdigits
仅提取看起来介于 3 到 5 个字符之间的字符串。- 对于前两种,剪切掉 之前或 之后的文本
x
。
答案3
输出ffprobe
如下所示:
streams_stream_0_width=1280
streams_stream_0_height=720
从技术上讲,您可以使用eval
将它们分配给bash
变量,但这不是必需的并且可能不安全;有关更多信息,请参见此处:
相反,由于您正在使用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