NB Frames は、動画や音声ファイル内の1つのストリームに含まれるフレーム数を表す値です。NB は「number(数)」を意味します。FFmpeg とその ffprobe プログラムは、この項目を nb_frames と呼びます。
1つのファイルには複数のストリームが含まれることがあり、それぞれのストリームには独自の NB Frames の値があります。例えば、動画ストリームが1つと音声ストリームが1つあるファイルには、別々のカウントが2つあることになります。NB Streams は別の値であり、ファイル内のストリーム本数を数えるもので、1つのストリーム内のフレーム数ではありません。
フレームとは何か
動画ストリームでは、フレームは動画を構成する1枚の静止画像です。音声ストリームでは、その意味はフォーマットによって異なります。
AIFF では、サンプルフレームは各オーディオチャンネルのサンプルを1つずつ含む単位です。MP3 ではフレームはより大きなブロックであり、FFmpeg はフレーム数にフレームあたりのサンプル数を掛けて長さを求めます。そのため、ある音声フォーマットのカウントを別のフォーマットのカウントと直接比較することはできません。
値の見え方
値が既知の場合は整数になります。以下の値が FFmpeg のコード、ドキュメント、およびテスト結果に現れます。
708: FFmpeg のテストファイルの1つに含まれる動画ストリームのフレーム数です。1: HEIC ファイル内の1枚の静止画像のフレーム数です。0: フレーム数が不明なときに、FFmpeg のプログラミングインターフェースが使用する値です。N/A: 値が 0 のとき、ffprobe の標準出力が表示する文字列です。JSON と XML の出力では、このフィールド自体が省略されます。
0 や N/A の値、またはフィールドが存在しないことは、そのストリームが空であることを意味しません。この値は、FFmpeg がこのフィールドにカウントを設定していないことだけを示します。
値の由来
NB Frames は通常、ファイル自体の構造から取得されるため、FFmpeg がフレームを数える必要はありません。値の由来はフォーマットによって異なります。
- MP4 と MOV: FFmpeg は time-to-sample テーブル(
sttsatom)内のサンプル数を合計します。 - AVI: FFmpeg はストリームヘッダー内の 32 ビット値(
strhチャンク)を読み取ります。 - AIFF: FFmpeg は Common Chunk にある
numSampleFramesフィールドを読み取ります。 - WAV、MP3、FLAC、および MKV: これらのフォーマット用の FFmpeg のリーダーはこの値を設定しないため、ffprobe の標準出力は
N/Aと表示します。
MKV ファイルには、別の名前でカウントが格納されている場合があります。mkvmerge プログラムは、各トラックに NUMBER_OF_FRAMES という名前のタグを書き込みます。
フレーム数を数える方法
NB Frames は、ファイル構造内の数字を繰り返しているだけです。この数字は、すべてのフレームが本当にファイル内に存在することを保証するものではありません。FFmpeg のある MOV テストファイルには 708 というカウントが保存されていますが、ffprobe はそのファイルから 66 個のパケットと 65 フレームしか読み取りません。
実際のカウントを測定するには、ffprobe を -show_streams と -count_frames オプション付きで実行します。ffprobe はそのストリームをデコードし、結果を nb_read_frames という別のフィールドで報告します。ffprobe がすべてのフレームをデコードする必要があるため、この処理にはより多くの時間がかかります。
この確認方法は動画ストリームに使用してください。AIFF ファイルでは、ffprobe は複数のサンプルフレームを含むデコード済みブロックを数えるため、完全なファイルであっても2つの数値は一致しません。
-count_packets オプションは、同じく -show_streams と併用し、パケットをデコードせずに数えて、その結果を nb_read_packets に出力します。動画のパケットには通常1つの圧縮フレームが含まれますが、音声パケットには複数のフレームが含まれる場合があります。
それが重要な理由
動画ストリームでは、フレーム数と再生時間を組み合わせることで、平均フレームレートが求まります。FFmpeg の MP4 および MOV リーダーは、フレーム数と再生時間からレートを計算します。同じテストファイルでは、708 フレームを 23.613333 秒で再生すると、約 29.98 フレーム/秒になります。
フレーム数は動画ファイルの確認にも役立ちます。測定したフレーム数が保存されているカウントより大幅に少ない場合、動画データの一部が欠落している可能性があります。