ビデオファイルがあり、その中のビデオフレームの数を取得したいと考えています。 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]
これは恐ろしく、愚かで、遅いですが、うまくいくようです:
ffmpeg -i foo.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1
切り捨てられたファイルや生のストリームでも正しく機能します(そのため、.vobファイルでは何も得られません)
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
別の質問 にこれを投稿しました。 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番目の出力行と最後の出力行)。
ほとんどのファイルでmediainfo --fullscan inputfile | grep "Frame count"
が適切に機能することがわかりました。
Debianベースのシステムはapt-get install mediainfo
でインストールできます
出力の1つではなく2行が表示される場合、最初の行はビデオトラックで、2番目の行はオーディオトラックです。これは、可変ビットレートオーディオのファイルで発生するようです。
編集日現在、.mkv、.m4v、.mp4、flv、vob、.aviサンプルでテスト済み。
ソース: Linuxでコマンドラインからビデオファイル情報を取得する方法 およびUbuntuフレーバーでのテスト。
あなたのOSで利用可能なmediainfoを見つけることができます こちら
ffprobe -select_streams v -show_frames -count_frames INPUT_FILE | grep pkt_duration_time =
期間を合計します。 sed/awkの方が好きかもしれないし、そうでないかもしれない。
私たちのテストから、今のところ、それが最も信頼性が高いことが示されていると言えます。正確なフレームカウントと正確な継続時間が得られます。 mediainfoのような他のすべてのツールがガガするように見える可変フレームレートでも。
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ベースのシステムにインストールできます。
mediainfo
を直接使用して、grepなし、待機なし、何もなし:
mediainfo --Inform='Video;%FrameCount%' $the_file
その他の情報については、mediainfo --info-parameters
を参照してください
フレーム数は実際には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)
そして、はい、何らかの理由で、整数部分を取得する必要があります。それは意味がありませんが、このスクリプトは、これまでのところ私の動画を常に適切に変換しています。
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]
これを行うには、ffprobeから取得した値を加算および乗算します。
注:ffprobeはlibav(avconv)-ffmpegのLinuxバージョンの一部です。
#your command -
ffprobe man.avi
これを行うと、1秒あたりのフレーム数と、クリップの継続時間も取得されます。
クリップの継続時間を秒に変換し、その値にフレーム数/秒を掛けます。
数値を最も近い値に切り上げることを忘れないでください。