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 кадра в секунду.
Счетчик также помогает проверить видеофайл. Если измеренное количество значительно ниже сохраненного, часть видеоданных может отсутствовать.