如何使用 ffmpeg 获取视频分辨率?

Vla*_*lov 56 video metadata ffmpeg

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

ffmpeg -i filename.mp4
Run Code Online (Sandbox Code Playgroud)

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

llo*_*gan 81

ffprobe

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
  1280x720
Run Code Online (Sandbox Code Playgroud)

其他输出格式选项的示例

有关-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
Run Code Online (Sandbox Code Playgroud)

没有钥匙:

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1:nk=1 input.mp4
  1280
  720
Run Code Online (Sandbox Code Playgroud)

CSV

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4
  1280,720
Run Code Online (Sandbox Code Playgroud)

JSON

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of json input.mp4
{
    "programs": [

    ],
    "streams": [
        {
            "width": 1280,
            "height": 720
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

  • @SalemF 附加 `| 排序-nur | 头-n 1`。这将返回最大宽度的分辨率。话虽这么说,在我见过的所有情况下,只有一个决议,但可能会重复。 (2认同)

aal*_*aap 8

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

高度:

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f1
Run Code Online (Sandbox Code Playgroud)

1280

宽度:

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f2
Run Code Online (Sandbox Code Playgroud)

720

两者的区别只是-f参数 to cut

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

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}'
Run Code Online (Sandbox Code Playgroud)

1280x720

这是我们对这些命令所做的:

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

  • ffmpeg 的输出仅适用于人眼,不能被脚本或其他工具解析。输出未标准化,因此不能保证所有文件的格式都相同,因此它是一个脆弱的用例。请改用 ffprobe。这个线程中有很多例子。 (2认同)

And*_*s F 1

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

ffmpeg -i filename.mp4 2>&1 | grep <keyword>
Run Code Online (Sandbox Code Playgroud)

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

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