Ваш вопрос не имеет смысла, поэтому кто-то голосует против вас.
Контейнерный файл
Во-первых, нет такой вещи, как 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;
}