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をコピーしました