Несколько видеопотоков 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?

4 ответов


параметры в двух примерах 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 97
    a=rtpmap:96 H264/90000
    a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ==
    a=rtpmap:97 H264/90000
    a=fmtp:97 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA=
    a=control:trackID=1

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

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

ссылки:

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

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


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

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


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

в чем именно заключается Ваш вопрос ? Это : как я могу изменить разрешение, не прерывая поток ?

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

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


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

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

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

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

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