Несколько видеопотоков 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
ссылки:
- формат полезной нагрузки RFC 3984 RTP для видео H. 264
- новый предлагаемый формат полезной нагрузки H. 264 RTP RFC 6184
- 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)