フレンドリーな方法でffmpeg情報を取得する


108

ffmpegを使用してビデオファイルに関する情報を取得しようとするたびに、多くの役に立たない情報と優れたものが混在しています。

私は使用していffmpeg -i name_of_the_video.mpgます。

それを友好的な方法で得る可能性はありますか?つまり、JSONはすばらしい(そして醜いXMLでも構いません)。

今までのところ、アプリケーションで正規表現を使用してデータを解析しましたが、特定のビデオファイルに表示される厄介なコーナーがたくさんあります。遭遇したことはすべて修正しましたが、まだまだあるかもしれません。

私は次のようなものが欲しかった:

{
  "Stream 0": {
     "type": "Video",
     "codec": "h264",
     "resolution": "720x480"
  },
  "Stream 1": {
     "type": "Audio",
     "bitrate": "128 kbps",
     "channels": 2
  }
}

3
あなたは見てとったffprobeを?JSONで読み取り可能な出力を提供するようです。
NT3RP

私はすでにそれを調べましたが、JSON出力フォーマットを見つけることができませんでした
JBernardo

回答:


292

少し遅れますが、おそらく誰かに関連しています。

ffprobe本当に素晴らしい方法です。注意、しかし、あなたが言う必要があることをffprobeあなたはそれを表示したい(とどのような情報-show_format-show_packetsおよび-show_streamsオプション)、または(あなたのコメントの一つに言及するように)、それはちょうどあなたの空白の出力を与えるでしょう。

たとえばffprobe -v quiet -print_format json -show_format -show_streams somefile.asf、次のような結果になります。

{
  "streams": [{
    "index": 0,
    "codec_name": "wmv3",
    "codec_long_name": "Windows Media Video 9",
    "codec_type": "video",
    "codec_time_base": "1/1000",
    "codec_tag_string": "WMV3",
    "codec_tag": "0x33564d57",
    "width": 320,
    "height": 240,
    "has_b_frames": 0,
    "pix_fmt": "yuv420p",
    "level": -99,
    "r_frame_rate": "30000/1001",
    "avg_frame_rate": "0/0",
    "time_base": "1/1000",
    "start_time": "0.000",
    "duration": "300.066",
    "tags": {
        "language": "eng"
    }
  }],
  "format": {
    "filename": "somefile.asf",
    "nb_streams": 1,
    "format_name": "asf",
    "format_long_name": "ASF format",
    "start_time": "0.000",
    "duration": "300.066",
    "tags": {
        "WMFSDKVersion": "10.00.00.3646",
        "WMFSDKNeeded": "0.0.0.0000",
        "IsVBR": "0"
    }
  }
}

1
誰もが今まで必要ならば、私はその答えに基づいて、PHPソリューションを書いた:stackoverflow.com/questions/11805207/...
パウロ・フレイタス

これを掘り下げて申し訳ありませんが、これをスピードアップする機会はありますか?出力が表示されるまで5〜6秒かかります
mangia 14

その最後の文はまさに私が必要としたものです。ありがとう:)
Matt Fletcher

5
人々... 4年前からの回答へのコメントで質問をすることは、回答を受ける可能性がほぼゼロです...
パトリック

1
-of json代わりに使用することもできます-print_format json。前者は互換性がavprobeありますが、後者は互換性がありません。
Chih-Hsuan Yen

15

-progress -フォーマットされkey=valueたわかりやすい情報を印刷するために使用できるようになりました。

ffmpeg  -i video.mp4 .......-s 1920x1080 -progress - -y out.mp4

speed=5.75x
frame=697
fps=167.7
stream_0_0_q=39.0
bitrate=2337.0kbits/s
total_size=6979778
out_time_ms=23893333
out_time=00:00:23.893333
dup_frames=0
drop_frames=0

3
知ってよかった。なぜこれがドキュメントに記載されていないのでしょうか。
Duvrai 2018

これはいい!「-progress-」がドキュメントで言及されていない理由は、「-」が単にそれを標準出力にパイプすることを意味するためです
Chris W

13

あなたは試すことができffprobeます。JSON出力を取得するための正しいコマンドは、次のようになります。

ffprobe ... -print_format json

2
最新のffmpegをコンパイルしましたが、プログラムのjson出力はのみ{}です。私が持っているビデオファイルでは動作しないようです...
JBernardo

2
@JBernardoねえ、他の誰かがこれに遭遇した場合、-ofではなく-print_formatを実行する必要があります。そうしないと、非常に役に立たない{...ここで通常の印刷出力...}が行われます。コマンドラインの例
mgrandi

0

もう1つの使用法ffprobeはうまく解析できます。

ffprobe -v error -select_streams v:0 -show_entries stream=width,height,r_frame_rate,bit_rate,codec_name,duration -of csv=p=0:s=x video.mp4

結果は:

h264x600x480x25/1x385.680000x542326

-select_streams v:0ビデオストリームのみを選択します。このパラメーターを削除すると、ストリームごとに1行が表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.