Как я могу узнать продолжительность любого файла h264? - PullRequest
4 голосов
/ 15 сентября 2011

У меня есть один файл, в котором есть только кадры h264 в форме блока NAL. Итак, есть ли способ подсчитать продолжительность этого файла?

Я не знаю, сколько кадров в файле. У меня есть только размер файла.

PS: все, что я хочу сделать, это на языке C и на платформе Linux.

Ответы [ 3 ]

5 голосов
/ 26 сентября 2011

Ваш вопрос не имеет смысла, поэтому кто-то голосует против вас.

Контейнерный файл

Во-первых, нет такой вещи, как H264 file.Может быть контейнерный файл (MP4, AVI, MKV), содержащий видео в кодировке H264.Этот формат контейнера обычно также содержит данные, указывающие на продолжительность содержащегося видео.Таким образом, вы должны проанализировать этот файл, проверить документацию формата, чтобы увидеть, где сохраняется длительность, а затем извлечь ее.

Самый простой способ - использовать FFMPEG, как предложил Аугусто.

NAL Byte Stream

Если ваш файл содержит только NAL-единицы, сохраняемые одна за другой, например,в потоке байтов NAL НЕТ ПУТИ , что вы можете получить продолжительность видео!Поскольку изображение в кодировке H264 не содержит информацию о времени.

Если это так, вы все равно можете сделать аппроксимацию, если знаете FPS видео ... Вам нужно подсчитать все кадры в файле, кроме:

  • Наборы параметров последовательности
  • Наборы параметров изображения
  • Конец потока
  • Конец последовательности
  • Фильтр данных
  • Разделитель единиц доступа

А затем выполните следующие действия: NUMBER_OF_FRAMES / FPS = DURATION_IN_SECONDS

Поток RTP

Если вы не правы, и на каждом блоке NAL есть заголовок RTP, вы можетелегко получить продолжительность видео, проверяя время RTP каждого заголовка RTP.Что означают байты в заголовке RTP, вы можете узнать здесь: http://www.networksorcery.com/enp/protocol/rtp.htm. Вы хотите получить TIMESTAMP часть (целое число 4 байта) от каждого.Код должен сделать это:

int last_timestamp = GetNextTimestamp();
double duration_in_ms = 0;

while(true)
{
    int next = GetNextTimestamp();
    duration_in_ms += (next - last_timestamp)/90000.0;
    last_timestamp = next;
}
1 голос
/ 12 июля 2017

h.264 действительно содержит информацию о времени.

Необработанные данные приложения h.264 в некоторой форме (память или файл) будут содержать несколько «наборов параметров последовательности» или кадров SPS.Обычно они содержат информацию о синхронизации, в частности, time_scale и num_units_in_tick.В большинстве сценариев частота кадров является фиксированной, которая определяется как «fixed_frame_rate_flag» в SPS.Продолжительность каждого кадра будет 2 * num_units_in_tick / time_scale (2 == 1 + nuit_field_based_flag).Кадры обычно разделяются разделителем единиц доступа.

Количество кадров, в течение которых длительность кадра даст вам общую продолжительность.

1 голос
/ 15 сентября 2011

Грязный способ получить длительность, которую используют многие разработчики, - запустить ffmpeg, чтобы получить информацию из файла, и проанализировать, что ffmpeg выводит на стандартный вывод.Я знаю, что это не идеально, но это работает.

Если вы запустите ffmpeg -i Sintel.2010.1080p.mkv (вы можете скачать Sintel с здесь ), одна из строк вывода будет Duration: 00:14:48.03, start: 0.000000, bitrate: 640 kb/s.Вы можете проанализировать строку и извлечь длительность.

Вы можете получить ту же информацию, вызвав некоторую функцию C непосредственно из ffmpeg, но это не в моих знаниях.

...