一行 ffmpeg (或其他) 仅获取分辨率?

一行 ffmpeg (或其他) 仅获取分辨率?

我不太熟悉命令行,所以希望这个问题不会太愚蠢。

如果我运行:

ffmpeg -i videofile.avi

我得到了如下输出:

ffmpeg version git-2013-11-21-6a7980e Copyright (c) 2000-2013 the FFmpeg develop    ers
  built on Nov 21 2013 12:06:32 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --prefix=/home/user/ffmpeg_build --extra-cflags=-I/home/user/ffmpeg_build/include --extra-ldflags=-L/home/user/ffmpeg_build/lib --b        indir=/home/user/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable    -libfdk-    aac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-l    ibx264 --enable-    nonfree
  libavutil      52. 53.100 / 52. 53.100
  libavcodec     55. 44.100 / 55. 44.100
  libavformat    55. 21.100 / 55. 21.100
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 91.100 /  3. 91.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, avi, from 'videofile.avi':
  Metadata:
    encoder         : Lavf52.68.0
  Duration: 00:23:07.68, start: 0.000000, bitrate: 2390 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480     [SAR 1:1 DAR 4:3], 23.98 fps, 23.98 tbr, 23.98 tbn, 1199 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p, 128 k    b/s

如果我只对输出“640x480”的命令感兴趣,我该怎么做?

我想我必须将输出通过管道传输到正则表达式并执行它?不知道该怎么做。谢谢!

答案1

ffprobe从 ffmpeg 包中使用:

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

示例结果:

1280x720

这些选项的作用:

  • -v error使输出更简洁。
  • -select_streams v:0仅选择第一个视频流。
  • -show_entries stream=width,heightwidth仅从可以提供的height大量参数列表中进行选择ffprobe
  • -of csv=s=x:p=0格式化文本输出。csv使用格式化类型是因为它会产生简单的输出。s=x使其使用 来x分隔widthheight值。p=0使其stream在输出中省略前缀。

查看ffprobe 文档FFmpeg Wiki:ffprobe 技巧了解更多信息。

答案2

使用 ffmpeg 获取视频分辨率:

ffmpeg -i filename 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+'

输出(例如):

640x480

答案3

exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

grep毫无顾忌地完成工作

单行代码如下:

exiftool -b metavideo.mp4 -ImageSize

这将返回您正在寻找的 WxH 字符串。

答案4

您可以使用正则表达式和来做到这一点ffmpeg,但我更喜欢使用exiftool, 的一部分libimage-exiftool-perl安装 libimage-exiftool-perl包裹:

$ exiftool some/video.ogv | awk -F' *: *' '$1 == "Image Size"{print $2}'
1242x480

为什么exiftool

  • ffmpeg/avprobe实用程序打印表单的行,Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480其中表单的一个或多个值AAAxBBB是可能的(如您在示例中所见)。确定哪一个是解决方案可能很困难。
  • exiftool另一方面,输出形式为 的数据Type : Value。因此更容易获取精确的字段,即Image Size。此外,考虑到字段的指定方式(用冒号和空格分隔),您可以轻松提取值。

什么awk命令的作用是:

  • 将字段分隔符设置为-由任意数量的空格包围的' *: *'冒号。:
  • 检查第一个字段($1)是否Image Size
  • 并打印第二个字段(print $2)。

另一个版本是:

awk '/^Image Size/{print $4}'
  • 默认情况下,awk 使用空格来分割字段,因此、Image和都是不同的字段。Size:1242x480
  • 通过将行的开头 ( ^) 与进行匹配Image Size,我们得到了正确的行。
  • 并且我们打印第四个字段(因为ImageSize:是前三个字段)。

相关内容