Словарь

Nb_frames что это значит?

NB Frames показывает, сколько кадров содержит видеопоток или аудиопоток. FFmpeg не сообщает это число для каждого формата, поэтому значение может быть неизвестно.

nb-frames

NB Frames означает количество кадров в одном потоке видео- или аудиофайла. Буквы NB обозначают "number" (число). FFmpeg и его программа ffprobe называют это поле nb_frames.

Файл может содержать несколько потоков, и у каждого потока свое значение NB Frames. Поэтому файл с одним видеопотоком и одним аудиопотоком имеет 2 отдельных счетчика. NB Streams - это другое значение: оно считает потоки в файле, а не кадры внутри одного потока.

Что такое кадр

В видеопотоке кадр - это одно неподвижное изображение видео. В аудиопотоке значение зависит от формата.

В AIFF один сэмпловый кадр содержит по одному сэмплу для каждого аудиоканала. В MP3 кадр - это более крупный блок, и FFmpeg умножает количество кадров на число сэмплов в кадре, чтобы получить длину. Поэтому вы не можете напрямую сравнивать количество аудиокадров в одном формате с количеством в другом формате.

Как выглядят значения

Когда значение известно, это целое число. Эти значения встречаются в коде FFmpeg, документации и результатах тестов:

  • 708: количество для видеопотока в одном из тестовых файлов FFmpeg.
  • 1: количество для одного статичного изображения в файле HEIC.
  • 0: значение, которое программный интерфейс FFmpeg использует, когда число неизвестно.
  • N/A: текст, который стандартный вывод ffprobe показывает, когда значение равно 0. В JSON- и XML-выводе это поле опускается.

Значение 0 или N/A, а также отсутствие поля не означает, что поток пустой. Это лишь означает, что FFmpeg не установил счетчик в этом поле.

Откуда берется значение

NB Frames обычно берется из структуры самого файла, поэтому FFmpeg не нужно пересчитывать кадры. Источник зависит от формата:

  • MP4 и MOV: FFmpeg суммирует количество сэмплов в таблице time-to-sample, которая является атомом stts.
  • AVI: FFmpeg считывает 32-битное число из заголовка потока, который является чанком strh.
  • AIFF: FFmpeg считывает поле numSampleFrames из Common Chunk.
  • WAV, MP3, FLAC и MKV: обработчики этих форматов в FFmpeg не устанавливают значение, поэтому стандартный вывод ffprobe показывает N/A.

Файл MKV все еще может содержать счетчик под другим именем. Программа mkvmerge записывает тег NUMBER_OF_FRAMES для каждой дорожки.

Как посчитать кадры

NB Frames просто повторяет число из структуры файла. Это число не доказывает, что все кадры действительно присутствуют в файле. В одном тестовом файле MOV в FFmpeg хранится количество 708, но ffprobe считывает из этого файла только 66 пакетов и 65 кадров.

Чтобы измерить количество, запустите ffprobe с параметрами -show_streams и -count_frames. Программа ffprobe затем декодирует поток и выводит результат в отдельное поле nb_read_frames. Это занимает больше времени, так как ffprobe должен декодировать каждый кадр.

Используйте эту проверку для видеопотоков. В файле AIFF ffprobe считает декодированные блоки, каждый из которых содержит множество сэмпловых кадров, поэтому даже в полном файле эти два числа различаются.

Параметр -count_packets, который также используется с -show_streams, считает пакеты без их декодирования и выводит результат в nb_read_packets. Видеопакет обычно содержит один сжатый кадр, но аудиопакет может содержать несколько.

Почему это важно

Для видеопотока количество кадров и длительность вместе дают среднюю частоту кадров. Обработчик MP4 и MOV в FFmpeg вычисляет частоту из количества кадров и длительности. В том же тестовом файле 708 кадров за 23,613333 секунды дают примерно 29,98 кадра в секунду.

Счетчик также помогает проверить видеофайл. Если измеренное количество значительно ниже сохраненного, часть видеоданных может отсутствовать.

Мета-ключи