web-dev-qa-db-ja.com

Linuxコマンドラインでビデオのフレーム数を取得するにはどうすればよいですか?

ビデオファイルがあり、その中のビデオフレームの数を取得したいと考えています。 ffmpegを使用して、ビデオとFPSの長さを取得できます。ただし、フレームの総数については、明確なものは何もありません。

理論的には、フレーム数を取得するために長さ(秒単位)にFPSを掛けることができるはずですが、この場合、長さ(34.43秒)とフレームレート(29.97 fps)は整数ではないため、私は何か間違っていると思います。

コマンドラインでこれを完全に自動化された非グラフィカルな方法で実行できるようにする必要があります。見積もりではなく、かなり正確であることも必要です(ビデオファイルでも可能である場合)。

一部のファイルでtcprobeを使用してみました。一部のAVIファイルでは機能しますが、一部のVOB=ファイルでは、tcprobe出力にフレーム数がありません。この出力が表示されます。

[tcprobe] MPEG program stream (PS)
[tcprobe] summary for myfile.vob, (*) = not default, 0 = not detected
import frame size: -g 720x480 [720x576] (*)
     aspect ratio: 4:3 (*)
       frame rate: -f 29.970 [25.000] frc=4 (*)
                   PTS=2199.3972, frame_time=33ms bitrate=7000 kbps
      audio track: -a 0 [0] -e 48000,16,5 [48000,16,2] -n 0x2000 [0x2000] (*)
                   PTS=2199.2763, bitrate=192 kbps
                   -D 3 --av_fine_ms 20 (frames & ms) [0] [0]
31
Rory

これは恐ろしく、愚かで、遅いですが、うまくいくようです:

ffmpeg -i foo.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1

切り捨てられたファイルや生のストリームでも正しく機能します(そのため、.vobファイルでは何も得られません)

20
user23307

ffprobeを使用して、メディアファイルに関する情報を取得できます。

ffprobe -select_streams v -show_streams input.avi

ストリームの詳細が表示されます。

nb_frames=159697

探す nb_frames with grep

ffprobe -select_streams v -show_streams input.avi 2>/dev/null | grep nb_frames | sed -e 's/nb_frames=//'

これはavi、mp4などで機能します。一部のコンテナでは、有効な値が表示されません。 mpeg。

その場合、これは機能しますffprobe -show_packets a.mpg 2>/dev/null | grep video | wc -l

32
Aftershock

別の質問 にこれを投稿しました。 tcprobeツール(transcodeパッケージから)を使用すると、フレームの数が情報に含まれます。使用 -iスイッチからファイルから情報ダンプを取得します。

$ tcprobe -i foo.avi
[tcprobe] RIFF data, AVI video
[avilib] V: 29.970 fps, codec=XVID, frames=38630, width=512, height=384
[avilib] A: 48000 Hz, format=0x55, bits=16, channels=2, bitrate=128 kbps,
[avilib]    53707 chunks, 21768720 bytes, VBR
[tcprobe] summary for foo.avi, (*) = not default, 0 = not detected
import frame size: -g 512x384 [720x576] (*)
       frame rate: -f 29.970 [25.000] frc=4 (*)
      audio track: -a 0 [0] -e 48000,16,2 [48000,16,2] -n 0x55 [0x2000] (*)
                   bitrate=128 kbps
           length: 38630 frames, frame_time=33 msec, duration=0:21:28.954

フレーム数はここでは2行で示されていることに注意してください(2番目の出力行と最後の出力行)。

16
quack quixote

ほとんどのファイルでmediainfo --fullscan inputfile | grep "Frame count"が適切に機能することがわかりました。

Debianベースのシステムはapt-get install mediainfoでインストールできます

出力の1つではなく2行が表示される場合、最初の行はビデオトラックで、2番目の行はオーディオトラックです。これは、可変ビットレートオーディオのファイルで発生するようです。

編集日現在、.mkv、.m4v、.mp4、flv、vob、.aviサンプルでテスト済み。

ソース: Linuxでコマンドラインからビデオファイル情報を取得する方法 およびUbuntuフレーバーでのテスト。

あなたのOSで利用可能なmediainfoを見つけることができます こちら

7
Elder Geek

ffprobe -select_streams v -show_frames -count_frames INPUT_FILE | grep pkt_duration_time =

期間を合計します。 sed/awkの方が好きかもしれないし、そうでないかもしれない。

私たちのテストから、今のところ、それが最も信頼性が高いことが示されていると言えます。正確なフレームカウントと正確な継続時間が得られます。 mediainfoのような他のすべてのツールがガガするように見える可変フレームレートでも。

4
Guillaume Blain

Ubuntuでテスト済み。

melt icecap.mp4 -consumer xml
  • melt-MeltはMLTフレームワークのテストツールとして意図されていましたが、強力なマルチトラックコマンドライン指向のビデオエディターでもあります。また、オーディオファイルやビデオファイルのミニマルなメディアプレーヤーとしても使用できます。

  • -consumer id [:arg] [name = value] *
    コンシューマー(シンク)を設定します

  • xml-コンシューマー(シンク)をxml形式の出力に設定します

  • <property name="length">nnnn</property>-フレーム数を表示します。ここで、nnnnはフレーム数と等しい整数に置き換えられます

メルトがない場合は、Sudo apt-get install meltを使用してUbuntuやその他のDebianベースのシステムにインストールできます。

3
neoneye

mediainfoを直接使用して、grepなし、待機なし、何もなし:

mediainfo --Inform='Video;%FrameCount%' $the_file

その他の情報については、mediainfo --info-parametersを参照してください

3
xenoid

フレーム数は実際にはfps * durationの2倍であることがわかりました(理由がわからないので、喜んでお知らせします)。

私のスクリプトでは、私は持っています:

# Get duration and fps
duration=$($FFMPEG -i $input 2>&1 | sed -n "s/.* Duration: \([^,]*\), start: .*/\1/p")
fps=$($FFMPEG -i $input 2>&1 | sed -n "s/.*, \(.*\) tb.*/\1/p")

hours=$(echo $duration | cut -d":" -f1)
minutes=$(echo $duration | cut -d":" -f2)
seconds=$(echo $duration | cut -d":" -f3)
# For some reason, we have to multiply by two (no idea why...)
# Get the integer part with cut
frames=$(echo "($hours*3600+$minutes*60+$seconds)*$fps*2" | bc | cut -d"." -f1)

そして、はい、何らかの理由で、整数部分を取得する必要があります。それは意味がありませんが、このスクリプトは、これまでのところ私の動画を常に適切に変換しています。

3
ℝaphink

linux

ffmpeg -i "/home/iorigins/Завантаження/123.mov" -f null /dev/null

ルビー

result = `ffmpeg -i #{path} -f null - 2>&1`
r = result.match("frame=([0-9]+)")
p r[1]
0
Yaroslav Maluk

これを行うには、ffprobeから取得した値を加算および乗算します。

注:ffprobeはlibav(avconv)-ffmpegのLinuxバージョンの一部です。

#your command -
 ffprobe man.avi

これを行うと、1秒あたりのフレーム数と、クリップの継続時間も取得されます。

クリップの継続時間を秒に変換し、その値にフレーム数/秒を掛けます。

数値を最も近い値に切り上げることを忘れないでください。

0
JJAtairu