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


30

ビデオファイルがあり、その中にあるビデオフレームの数を取得したい。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]

あなたの方程式はあなたに良い球場の見積もりを与えます; 浮動小数点の結果を切り上げるだけです。正確なフレーム数が必要な場合は、ファイルを直接調べる必要があります。ビデオコーデックの特性により、どちらの方向でも1つまたは2つ推定値がずれている場合があります。
いんちきのキホーテ2009

これらのオールインワンVOBまたはDVDスタイルの複数ファイルへの分割VOBですか?
いんちきのキホーテ

回答:


17

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

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

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


それはかなりいいです。私の経験では、それほど長くはかかりません。ただし、40分のファイルの実行には約3秒かかります。「^ M」は2文字の^とMではないことに注意してください。Control-Vを押してから入力する必要があります。私が使用したコマンドの代わりに:ffmpeg -i somefile.avi -vcodec copy -f rawvideo -y / dev / null 2>&1 | tr "^ M" '\ n' | grep '^ frame =' | perl -pe 's / ^ frame = \ s *([0-9] +)\ s。* $ / \ 1 /' | 「フレーム=」の後にはスペースがない場合、コマンドが失敗した1 -n尾
ロリー・

1
Ubuntu 12.04、ffmpegバージョンgit-2013-04-15-a4f03f0では、との両方| tr ^M '\n'を省略できます|tail -n 1。また、その後にスペースframes=がなくなることはありません。(たぶん、過去4年間で何かが変更されました。)
カミーユ・グドゥスヌ14

私にとっては、これは毎回異なる値を返す
-CAMOBAP

1
MediainfoソリューションはVOBで動作します。代わりにそれをお勧めします。root @ lanparty:/ mnt / films#mediainfo --fullscan Bugs_Bunny.vob | grep -i frame \ countフレームカウント:175715フレームカウント:183218
kevinf

32

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

ffprobe -select_streams v -show_streams input.avi

ストリームに関する詳細を取得します。

nb_frames=159697

探しnb_framesgrep

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


良いアイデア。ビデオストリームのみを選択し、出力をフィルタリングするようにコマンドを少し変更しました。それはあなたにちょうどフレームの数を与えます。
slhck 14年

1
MPEG-2で動作する2番目のソリューションをおめでとうございます!
マラト

1
MKVコンテナでは機能しません。
チェンクアルティ


最初のアプローチは、VBRエンコードファイルでは失敗するようです。2番目のアプローチはより信頼性があります。
オタク長老

16

別の質問にこれを投稿しました。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番目の出力行と最後の出力行)で示されていることに注意してください。


それは良い答えのように見え、いくつかのファイルで機能しますが、私が持っているいくつかのVOBファイルでは、出力にそのデータがありません。私は私が得る出力と質問を更新しました
ロリー・

私は、tcprobeがこの情報のファイルヘッダーを調べていることを期待しています(確かにわかりません)。ヘッダーに含まれていない場合、tcprobeはその計算を試行しない場合があります。良い質問; 良い答えがあったらいいのに。
いんちきキホーテ

これはVBRでエンコードされたファイルでは機能しないようです。フレームカウントの出力はありません。解像度、アスペクト比、フレームレートを取得します。
オタク長老

7

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

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

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

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

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

OS 利用可能なmediainfoをここで見つけることができます


4

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

期間を合計します。sed / awkを使うともっと面白くなるかもしれません。

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


3

フレーム数は実際には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)

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


FPSは1秒あたりのフレーム数(または一人称シューティングゲーム:D)の略であり、30 FPSがある場合は単純にビデオの秒数を掛けます。
ジョンT

はい、ジョン、私はそれを理解することができましたが、正しい量のフレームを取得するために2を掛ける必要がある理由を説明していません...私の場合、フレームの量を計算した後、バックグラウンドでログを分析し、進行状況バーを作成します。ログには、変換で渡されたフレームの数が示されます。ビデオ全体が変換されると、フレーム#はint(seconds * fps * 2)であったため、私のコードですが、理由を知りたいです;-)
phinaphink 09

好奇心が強いです。tcprobe私の答えの出力は、フレーム数を正確にseconds * fps(切り上げ)として示しています。ffmpegの奇妙な現象が見られると思います。他のツールでファイルを分析して、同じフレーム数が表示されるかどうかを確認しましたか?
いんちきのキホーテ2009

うーん...興味深い。私はビデオにしようと、私はだseconds*fps=1001.59tcprobe=1002。したがって、明らかに、tcprobe2を掛ける必要はないことを教えてくれます。ffmpegが変換中にログの2倍の数値を返すのはなぜですか?
チャフィンク2009

2
インターレース映像ですか?その場合、フレームごとに2つのフィールドがあり、フィールドの数を示している可能性があります。
STIB

3

Ubuntuでテスト済み。

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

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

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

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

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


1
これは非常に短いですが、それが何をするのか、なぜそれが機能するのかなどを拡張したいですか?
デビッド

これは、を介してフレームカウントを提供しないh264 mp4ファイルでうまく機能しmediainfo -fullscan filenameます。
オタク長老

3

直接mediainfo、grep、no wait、nothingなしで:

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

その他の情報については mediainfo --info-parameters


0

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

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

#your command -
 ffprobe man.avi

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

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

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


Ubuntu 14.04ではffprobe、LTS は使用できませんが、avprobein と呼ばれるものがありlibav-toolsます(これも提供しますavconv)。しかし、私の側では、少なくとも私が試したフォーマットについては、何フレームも印刷しません。ただ印刷するだけでなく、印刷するものavprobe -iもありますが、これは残念ながら形式に関するほんの一部です。たとえ-v debugそれがインストールされているハードウェアとソフトウェアのいくつかの素晴らしい特性を教えてくれただけで、プローブするファイル/ストリームに関する興味深い情報のほんの少しは教えてくれません。おそらく、利用可能な無数のオプションのいくつかに隠れています。知るか?
ティノ

@Tino ffprobeは、ffmpegパッケージの一部として実際に利用可能です。avconvはffmpegのフォークであり、混乱を引き起こしました。参照:stackoverflow.com/questions/9477115/...
エルダーオタク

@ElderGeek Ubuntu 14.04 LTSの場合ffmpeg、公式リポジトリにはありません。あなたが正しく与えたリンクはそれを述べています:FFmpegはUbuntu 15.04「Vivid Vervet」で返されました。。ただし、16.04 LTSがリリースされたため、状況が変わりました。
ティノ

@Tinoそれは確かに事実です。ただし、リポジトリに存在しないと利用できないとは見なしません。Trusty(14.04)で利用できることに注意してください:ffmpeg.org/download.html
Geek長老

0

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]

-2

最適な方法:(正しいパラメーターを計算して直接、ffmpegで確認)

Cmd->

ffprobe.exe -v error -select_streams v:0 -show_entries stream=r_frame_rate,duration -of default=nw=1 "d:\movies\The.Matrix.1999.1080p.BrRip.x264.YIFY.dut.mp4"

結果->

r_frame_rate=24000/1001
duration=8177.794625

計算->

Frames=24000/1001*8177.794625=196071 (exactly... ;P)

証明->

ffmpeg -i "d:\movies\The.Matrix.1999.1080p.BrRip.x264.YIFY.dut.mp4" -f 

null /dev/null
ffmpeg version N-92938-g0aaaca25e0-ffmpeg-windows-pacman Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8.2.0 (GCC)
  configuration: --pkg-config=pkg-config --pkg-config-flags=--static --extra-version=ffmpeg-windows-pacman --enable-version3 --disable-debug --disable-w32threads --arch=x86_64 --target-os=mingw32 --cross-prefix=/opt/sandbox/cross_compilers/mingw-w64-x86_64/bin/x86_64-w64-mingw32- --enable-libcaca --enable-gray --enable-libtesseract --enable-fontconfig --enable-gmp --enable-gnutls --enable-libass --enable-libbluray --enable-libbs2b --enable-libflite --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libzimg --enable-libzvbi --enable-libmysofa --enable-libaom --enable-libopenjpeg --enable-libopenh264 --enable-liblensfun --enable-nvenc --enable-nvdec --extra-libs=-lm --extra-libs=-lpthread --extra-cflags=-DLIBTWOLAME_STATIC --extra-cflags=-DMODPLUG_STATIC --extra-cflags=-DCACA_STATIC --enable-amf --enable-libmfx --enable-gpl --enable-avisynth --enable-frei0r --enable-filter=frei0r --enable-librubberband --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxvid --enable-libxavs --enable-avresample --extra-cflags='-march=core2' --extra-cflags=-O2 --enable-static --disable-shared --prefix=/opt/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32 --enable-nonfree --enable-decklink --enable-libfdk-aac
  libavutil      56. 25.100 / 56. 25.100
  libavcodec     58. 43.100 / 58. 43.100
  libavformat    58. 25.100 / 58. 25.100
  libavdevice    58.  6.101 / 58.  6.101
  libavfilter     7. 47.100 /  7. 47.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'd:\movies\The.Matrix.1999.1080p.BrRip.x264.YIFY.dut.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.25.100
  Duration: 02:16:17.91, start: 0.000000, bitrate: 2497 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x800 [SAR 1:1 DAR 12:5], 2397 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 93 kb/s (default)
    Metadata:
      handler_name    : GPAC ISO Audio Handler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> wrapped_avframe (native))
  Stream #0:1 -> #0:1 (aac (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, null, to '/dev/null':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.25.100
    Stream #0:0(und): Video: wrapped_avframe, yuv420p, 1920x800 [SAR 1:1 DAR 12:5], q=2-31, 200 kb/s, 23.98 fps, 23.98 tbn, 23.98 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      encoder         : Lavc58.43.100 wrapped_avframe
    Stream #0:1(und): Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s (default)
    Metadata:
      handler_name    : GPAC ISO Audio Handler
      encoder         : Lavc58.43.100 pcm_s16le

ここに

frame=196071 fps=331 q=-0.0 Lsize=N/A time=02:16:17.90 bitrate=N/A speed=13.8x

出力

video:102631kB audio:1408772kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
shareeditdeleteflag

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