Несколько видеопотоков H.264 в одном сеансе RTP

Я хотел бы динамически переключать источник видео в потоковое видео приложение. Однако различные видеоисточники имеют уникальные размеры изображения. Я могу генерировать отдельные файлы SDP для каждого источника видео, но я хотел бы объединить их в один SDP файл, чтобы клиент просмотра мог автоматически изменять размер окна дисплея при изменении источника видео. Вот два примера SDP файлов:

640x480.sdp:

v=0
o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
s=VideoStream640x480
t=0 0
c=IN IP4 192.168.0.2
m=video 8000/2 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ==
a=control:trackID=1

960x480.sdp:

v=0
o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
s=VideoStream960x480
t=0 0
c=IN IP4 192.168.0.2
m=video 8000/2 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA=
a=control:trackID=1

Как эти отдельные файлы могут быть объединены в один файл SDP?

Ответ 1

Параметры в ваших двух примерах sdp очень близки - имя потока и набор параметров sprop различаются. Я предполагаю, что вы не заботитесь о имени потока. Если вам нужны отдельные наборы параметров sprop-параметров и клиенты поддерживают стандартную колодку, вы можете использовать отдельные типы динамических полезных данных для каждого разрешения и иметь один SDP следующим образом:

 v = 0   o = VideoServer 305419896 9876543210 В IP4 192.168.0.2   s = VideoStream640x480   t = 0 0   c = IN IP4 192.168.0.2   m = видео 8000/2 RTP/AVP 96   97  a = rtpmap: 96 H264/90000   a = fmtp: 96 пакетирование-режим = 0; Профиль уровня-ID = 4D4033; sprop-наборы параметров = Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU =, == aO48gJ   a = rtpmap:   97 H264/90000   a = fmtp:   97 пакетирование-режим = 0; Профиль уровня-ID = 4D4033; sprop-параметр-наборов = J01AM5WwPA9sBAIA, KO4G8gA =   а = контроль: TrackID = 1

Как и в других ответах, если вам действительно не нужны разные имена потоков или разные наборы параметров sprop-параметров, вы должны использовать свой первый SDP и переключить средний поток. Я не очень хорошо знаю полезную нагрузку H.264 или вашего конкретного декодера, чтобы гарантировать, что это будет работать в ваших приложениях, но очень часто в приложениях для видеоконференций можно динамически переключаться между разрешениями без сигнализации об изменении или требовать отдельной динамической тип полезной нагрузки.

Хотя вы можете объединить два SDP-документа, как указано в другом ответе, я не думаю, что это поможет в этом случае. Декодеры H.264 могут работать только с одним параметром параметров sprop-parameter-sets, который, как я полагаю. Поскольку оба SDP имеют одинаковый тип полезной нагрузки, порт источника и т.д., Приемник не будет знать, когда использовать параметр sprop-parameter-sets. ОБНОВЛЕНИЕ: Обратите внимание, что некоторые реализации получают их sprops внутри, а не из SDP (или только изначально из SDP). Если это применимо в вашей среде, набор параметров sprop-параметров SDP может быть обновлен inband

Литература:

[Извините за отсутствие полного цитирования - не стесняйтесь исправить]

Ответ 2

Я перешел к RFC (RFC2327 - SDP: протокол описания сеансов), и, похоже, вы можете просто объединить два документа SDP, В документе явно указано:

Когда SDP передается SAP, для каждого пакета допускается только одно описание сеанса. Когда SDP передается другими способами, описание нескольких описаний SDP может быть объединено вместе (строка `v = ', указывающая начало описания сеанса, завершает предыдущее описание).

Ответ 3

Я думаю, это зависит от вашего декодера. Если он поддерживает изменение параметров внутри потока, то, если вы можете сказать кодировщику, чтобы поместить соответствующий заголовок при изменении разрешения, ваш декодер должен автоматически переключаться.

Каков ваш вопрос? Это: Как изменить разрешение без остановки/перезапуска потока?

Я не думаю, что вы можете заранее сообщить декодеру, вот потенциальное разрешение, которое вы увидите с помощью некоторой магии sdp. Либо ваш декодер способен понимать изменение параметра H264, а затем вы в порядке, или вам нужно остановить перезагрузку всего, а затем достаточно динамического sdp.

Я знаю, что, например, VLC способен обнаруживать изменение кодировки MP4 (например, перемещение из переменной скорости передачи в бит в постоянную скорость передачи), но сбой, если вы измените разрешение Единственное, что вы можете сделать с помощью sdp, - это комбинировать различное описание мультимедиа, например, с использованием разных типов динамической полезной нагрузки и атрибута идентификатора элемента управления.

Ответ 4

Вы можете либо выполнить динамическое изменение полезной нагрузки, либо изменить набор параметров в потоке, либо повторно использовать протокол SIP.

У изменений в полезной нагрузке возникает проблема: если вы не управляете кодировщиком и декодером, вам нужно убедиться, что другой конец принимает обе полезную нагрузку, и что они будут правильно переключаться с полезной нагрузкой (и достаточно быстро для вас - нет требования к что).

В потоковых изменениях возникает проблема, если пакеты с параметрами теряются. Вы можете использовать другой набор наборов параметров (переключитесь с набора параметров с 1 на 2 при изменении), чтобы избежать неправильного декодирования - если наборы потеряны, вы должны просто получить замороженное или пустое изображение. Я бы посоветовал повторную передачу их несколько раз (не в слишком быстрой последовательности).

SIP re-INVITE является внеполосным и подтвержденным и, таким образом, безопасным, но добавляет задержку к любому коммутатору и может сбой в зависимости от получателя и может быть отклонен.

(Примечание: я автор RFC 3984bis, обновление для RFC 3984)