Как рассчитать эффективное смещение времени в RTP - PullRequest
2 голосов
/ 06 июня 2011

Мне нужно рассчитать временное смещение между пакетами в потоках RTP.С видео потоком, закодированным с помощью кодека Theora, у меня есть поле метки времени, например

 2856000
 2940000
 3024000
 ...

. Поэтому я предполагаю, что смещение передачи составляет 84000. С аудио кодеком speex у меня есть поле метки времени, например

 38080
 38400
 38720
 ...

Предположим, что смещение передачи составляет 320. Почему значения такие разные?Это микросекунды, миллисекунды или что?Могу ли я обобщить формулу для расчета задержки между пакетами в микросекундах, которая работает с любым кодеком?Спасибо.

Ответы [ 3 ]

5 голосов
/ 07 июня 2011

Метки времени RTP зависят от носителя. Они используют частоту дискретизации используемого кодека. Вы должны преобразовать их в миллисекунды перед сравнением с вашими часами или с отметками времени из других потоков RTP.

Добавлено:

Чтобы преобразовать отметку времени в секунды, просто поделите отметку времени на частоту выборки. Для большинства аудиокодеков частота дискретизации составляет 8 кГц.

См. здесь для нескольких примеров.

2 голосов
/ 05 февраля 2014

Изучал этот вопрос около часа для случая звука.Похоже, ответ таков: временная метка RTP увеличивается на количество звуковых единиц времени (выборок) в пакете.Возьмите этот пример, где у вас есть поток закодированного 2-канального звука, сэмплированного на 44100 перед кодированием звука.Скажем, вы отправляете 512 аудиосэмплов (256 единиц времени, потому что у нас есть 2-канальный звук) для каждого пакета.Предполагая, что первый пакет имеет временную метку 0 (он должен быть случайным, хотя в соответствии со спецификацией RTP (RFC 3550)), вторая временная метка будет 256, а третья 512. Получатель может преобразовать значение обратно в фактическое время с помощьюделение метки времени на частоту дискретизации звука, поэтому первый пакет будет иметь значение T0, второй будет равен 256/44100 = 0,0058 секунды, третий - 512/44100 = 0,0116 секунды и т. д.

Кто-то, пожалуйста, исправьте меня, еслиЯ ошибаюсь, я не уверен, почему нет онлайн-статей, в которых так говорится.Я предполагаю, что было бы сложнее, если бы разрешение метки времени RTP отличалось от частоты дискретизации аудиопотока.Тем не менее, преобразование временной метки в другое разрешение несложно.Используйте пример, как и раньше, но измените разрешение временной метки RTP на 90 кГц, как в MPEG4 Audio (RFC 3016).Со стороны источника первая временная метка равна 0, вторая - 90000 * (256/44100) = 522, а третья - 1044. А на приемнике время равно 0 для первого пакета, 522/90000 = 0,0058 для второгои 1044/90000 = 0,0116 для третьего.Снова, кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь.

2 голосов
/ 13 июня 2011

Обратите внимание, что видеокодеки обычно используют 90000 для отметки времени.

Вместо того, чтобы угадывать тактовую частоту, посмотрите на строку a = rtpmap в sdp для используемой полезной нагрузки. Пример:

a=audio 5678 RTP/AVP 0 8 99
a=rtpmap 0 PCMU/8000
a=rtpmap 8 PCMA/8000
a=rtpmap 99 AAC-LD/16000

Если полезная нагрузка равна 0 или 8, отметки времени составляют 8 кГц. Если это 99, они 16 кГц. Обратите внимание, что строка rtpmap имеет необязательный параметр channel, как в «имя = полезная нагрузка a = rtpmap [/ channel]»

...