Неверное время презентации в потоках H264 [Live555 OpenRtspClient] - PullRequest
1 голос
/ 19 декабря 2011

Я изменяю OpenRtspClient так, чтобы

  • Теперь вместо записи кадров в файл я собираю их в очередь с входящим временем представления

  • Затем передайте кадры h264 в мультиплексор MP4 [Фильтр мультиплексирования Geraint Davies MP4]

  • Наконец, запишите мультиплексированные данные в файл ...

Так я смогу сохранить поток h264в контейнер MP4 ...

Но проблема в том, что некоторые из записанных данных [НЕ все они] имеют неправильные значения для продолжительности времени:

Предположим, что10-минутная запись кажется, что это был 12-часовой поток ... VLC воспроизводит 10-минутные, которые воспроизводят последний кадр за оставшееся время.

Кажется, что я неправильно установил время выборки в Muxer ... Тогда яотладить и увидеть, что есть положительные и отрицательные резкие скачки на отметках времени ...

Вот как я устанавливаю отметки времени:

  • Первое - я беру presentationTime из функции H264VideoFileSink :: afterGettingFrame1
  • Тогда вычислите пихтуstPresentaionTime [в начале]
  • Затем соберите другие метки времени

И я вижу, что значения frameTimeStamp показывают резкие скачки к отрицательным или положительным значениям ... [я сохраняю эти значения как int64]

#define TIMEVAL_TO_REFERENCE_TIME(x) 
      ((__int64)(x.tv_sec * 1000000) + x.tv_usec) * 10

void  H264VideoFileSink::
 afterGettingFrame1(unsigned frameSize, struct timeval presentationTime) 
{

    // At the beginning [ just for once calculate firstPresentaionTime ]

    firstPresentaionTime = TIMEVAL_TO_REFERENCE_TIME(presentationTime);

    // for the other frames collect frames timestamps

    frameTimeStamp = TIMEVAL_TO_REFERENCE_TIME(presentationTime) - 
firstPresentationTime

    }

Что это за причина?

  • Или это хорошая идея - использовать это "presentationTime" для MP4 Muxer?
  • Где вычисляется "presentationTime" в библиотеке?
  • Возможно ли эточто H264VideoFileSink :: afterGettingFrame1 значения «presentationTime» метода могут быть неправильными?
  • Кто-нибудь записывает поток h264 в константе mp4 и хочет поделиться своим опытом?

Ответы [ 2 ]

0 голосов
/ 26 декабря 2011

Если вы используете класс сжатия MPEG - в видео, отметка времени презентации будет подниматься и опускаться. Это потому, что если у вас есть I и P кадры, кодируются до их соседей B кадров, которые зависят как от прямого, так и от обратного.

Например, номер кадра 0, 1, 2, 3 - может быть I, B, B, P - но когда фактически они передаются, он становится 0, 3, 1, 2 - (I, P, B, B ). Очевидно, PTS (метка времени представления) кадра 3> PTS кадра 1, следовательно, вы получаете PTS 1 - это отрицательно в соответствии с вашей логикой.

0 голосов
/ 19 декабря 2011

В частичном ответе на ваш вопрос:

  • Где рассчитывается "presentationTime" в библиотеке?
  • Возможно ли, что значения "presentationTime" метода H264VideoFileSink :: afterGettingFrame1 могут быть неправильными?
  • время представления основано на метке времени RTP образца.
  • Маловероятно, что мы использовали live555 в течение довольно длительного периода без каких-либо проблем с отметками времени.Если временные метки неверны, я подозреваю, что временная метка неверна в источнике RTP, то есть в RTSP-сервере или камере.Может быть, а может и не быть полезным вынюхивать RTP-пакеты с помощью wireshark, чтобы посмотреть на временные метки RTP, а затем преобразовать обратно в NTP-время оттуда, чтобы увидеть разницу между последовательными кадрами.
...