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 кадра на секунду.
Лічильник також допомагає перевірити відеофайл. Якщо виміряна кількість значно менша за збережену, частина відеоданих може бути відсутня.