Несколько видеопотоков H.264 в одном сеансе RTP - PullRequest
10 голосов
/ 02 октября 2008

Я хотел бы динамически переключать источник видео в приложении потокового видео. Однако разные видеоисточники имеют уникальные размеры изображения. Я могу сгенерировать отдельные файлы 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?

Ответы [ 4 ]

8 голосов
/ 24 октября 2008

Параметры в ваших двух примерах sdp очень близки - имя потока и наборы параметров sprop отличаются. Я полагаю, вам нет дела до названия потока. Если вам нужны отдельные наборы параметров sprop и клиенты хорошо поддерживают стандарт, вы можете использовать отдельные динамические типы полезной нагрузки для каждого разрешения и иметь один 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 <B>97</B>
    a=rtpmap:96 H264/90000
    a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ==
    a=rtpmap:<b>97</b> H264/90000
    a=fmtp:<b>97</b> packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA=
    a=control:trackID=1

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

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

Ссылки:

  1. Формат полезной нагрузки RFC 3984 RTP для видео H.264
  2. Новый предложенный формат полезной нагрузки R.2 H.264 RFC 6184
  3. RFC 4566 SDP: протокол описания сеанса

[Извините, что не предоставил полный цитат - не стесняйтесь исправить]

2 голосов
/ 05 октября 2008

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

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

0 голосов
/ 05 ноября 2009

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

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

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

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

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

0 голосов
/ 06 октября 2008

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

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

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

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

...