一个衬板ffmpeg(或其他)仅获得分辨率?


9

我不太熟悉命令行,因此希望这不是一个愚蠢的问题。

如果我运行:

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”的命令感兴趣,该怎么办?

我想我必须将输出传递给正则表达式并执行正则表达式吗?不知道该怎么做。谢谢!

Answers:


10

使用ffmpeg获取视频分辨率:

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

输出(例如):

640x480

穆鲁的答案肯定绰绰有余,但是这个答案专门回答了我提出的问题(即使用ffmpeg)。我不知道选择答案的协议是什么。在这种情况下,我认为穆鲁的答案会更有帮助,而赛勒斯的答案则更为重要。抱歉,不确定该
走哪

1
不过要小心。问题中显示的示例将导致grep产生两个匹配项(第一个0x44...和第二个为分辨率)。
muru

如果输入包含多个视频流,例如DVD的输入,则此答案将width x height在多行中输出每个视频流。如果需要ffprobe,可以通过或head -n 1在答案中添加命令来避免这种情况。
llogan


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

做这项工作没有任何grep小号

单线看起来像:

exiftool -b metavideo.mp4 -ImageSize

这将返回您要查找的WxH字符串。


从技术上讲,这不是单线的。
David Foerster

我没有注意到它是一线请求的,无论如何,执行相同的宽度-ImageSize参数会返回WxH字符串。
Alex Dolgov

再次查看问题标题!;-)无论如何+1
David Foerster

3

我在这里仅看到使用exiftool和解析其输出的示例,这似乎是一个奇怪的选择。exiftool可以直接用于获取分辨率(以及几乎所有其他元数据):

exiftool -ImageSize -s3 filename

将结果输出的形式WIDTHxHEIGHT(EQ: 1280×720

注意: -s3指示exiftool产生最短的输出格式(不带标签名称,引号等)


2

为此,可以使用正则表达式和做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中使用空格分割领域,因此ImageSize:1242x480都是不同的领域。
  • 通过将行的开头(^)与匹配Image Size,我们得到正确的行。
  • 而我们打印第四场(因为ImageSize并且:是前三个字段)。

谢谢!我可能建议您编辑示例,将“ Ubuntu_Free_Culture_Showcase / How \ fast.ogg”更改为更通用的名称。起初,我之所以使用它是因为我没有将其识别为文件名。当然,两秒钟后我看到了我的错误,您的解决方案效果很好!
bcsteeve

@bcsteeve之所以使用它,是因为它是Ubuntu桌面中安装的示例内容的一部分(请参阅参考资料/usr/share/example)。:D
大师

1

稍微深奥的用法mediainfo将很容易以您使用简单的单线后的格式提取宽度和高度。在我的系统上观察以下示例:

andrew@illium~$ mediainfo --Inform="Video;%Width%x%Height%" test.mp4
1920x1080

可以看到以这种方式可以使用的各种其他参数,mediainfo --Info-Parameters但也许这种简单的用法本身就可以满足您的需要。


0

我进行了1个线性for循环以从文件目录中提取分辨率。

for i in $(ls "/root/vidz/dollabillz/"*); do eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height "$i"); size=${streams_stream_0_width}x${streams_stream_0_height}; echo $i $size; done;

3
解析ls不会很好结束 ...引用无法解决问题
Zanna

100,000次编码后,我还没有失败
Kevin Dollabillz '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.