ffprobeで録画時間やビットレート、fpsを表示するには

FFmpegは、動画の変換ツール群です。FFmepgをインストールすると、ffmpegコマンドやffprobeコマンド、ffplayコマンドもインストールされます。

このなかのffprobeは、動画の録画時間やビットレート、fpsなどの情報を表示します。

ffprobeで、知りたい項目だけを表示・取得するには、どのように使えばいいでしょうか。

(1)オプションなし

バージョン情報やコンパイルオプションが表示された後、動画情報や音声情報が表示されます。stderrに表示されるので、なぜだろうと思っていたら、これらはログ情報として表示されているからなんですね。

$ ffprobe tmp.mp4 ffprobe version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2007-2019 the FFmpeg developers built with gcc 7 (Ubuntu 7.3.0-16ubuntu3) (省略54. 7.100 / 54. 7.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '200123_102825.mp4': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: isommp42 creation_time : 2020-01-23T01:28:30.000000Z com.android.version: 9 Duration: 00:00:03.34, start: 0.000000, bitrate: 18166 kb/s (省略

(3)を知るまでは、grepとbashの正規表現でやってましたが、パースが面倒でした。

(2)-show_streamsオプション

$ ffprobe -loglevel quiet -show_streams tmp.mp4 [STREAM] index=0 codec_name=h264 codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 profile=High codec_type=video codec_time_base=300841/17820000 codec_tag_string=avc1 codec_tag=0x31637661 width=1920 height=1080 coded_width=1920 coded_height=1080 has_b_frames=0 sample_aspect_ratio=1:1 display_aspect_ratio=16:9 pix_fmt=yuvj420p level=40 color_range=pc color_space=smpte170m color_transfer=smpte170m color_primaries=smpte170m chroma_location=left field_order=unknown timecode=N/A refs=1 is_avc=true nal_length_size=4 id=N/A r_frame_rate=359/12 avg_frame_rate=8910000/300841 time_base=1/90000 start_pts=0 start_time=0.000000 duration_ts=300841 duration=3.342678 bit_rate=16133498 (省略

(1)より整形されています。さらに、-show_streamsは、-print_formatでフォーマットを指定することができます。JSONフォーマットを指定したのが(3)です。

(3)-print_format json オプション

-show_streamsとともに使います。ここではJSONを指定しました。

$ ffprobe -loglevel quiet -show_streams -print_format json tmp.mp4 { "streams": [ { "index": 0, "codec_name": "h264", "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10", "profile": "High", "codec_type": "video", "duration": "3.342678", (省略

やっと、使いやすいデータになりました。

録画時間は、streams[0].duration ですね。jqコマンドで取り出します。

$ ffprobe -loglevel quiet -show_streams -print_format json tmp.mp4 | jq .streams[0].duration -r 3.342678

シェルスクリプトでは、次のように使いました。

#!/bin/bash set -u set -e src=$1 duration=$(ffprobe -loglevel quiet -show_streams -print_format json $src | jq .streams[0].duration -r) echo $duration bitrate=$(ffprobe -loglevel quiet -show_streams -print_format json $src | jq .streams[0].bit_rate -r) echo $bitrate fps=$(ffprobe -loglevel quiet -show_streams -print_format json $src | jq .streams[0].r_frame_rate -r) fps=$(echo "scale=1; $fps" | bc) echo $fps width=$(ffprobe -loglevel quiet -show_streams -print_format json $src | jq .streams[0].width -r) echo $width height=$(ffprobe -loglevel quiet -show_streams -print_format json $src | jq .streams[0].height -r) echo $height

シェルスクリプトで書いた後、nodejsで書いたほうが簡単だったかなと思いました。

参考URL

タイトルとURLをコピーしました