Словник

Що означає 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 кадра на секунду.

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

Мета ключі