Вопрос

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

Это было полезно?

Решение

Параметры в ваших двух примерах sdp очень близки - название потока и наборы sprop-parameter-отличаются.Я предполагаю, что вас не волнует название потока.Если вам нужны отдельные наборы 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-parameter, вы должны иметь возможность использовать свой первый SDP и переключать формат в середине потока.Я не знаю фактическую полезную нагрузку H.264 или вашего конкретного декодера достаточно хорошо, чтобы гарантировать, что это будет работать в ваших приложениях, но в приложениях для видеоконференций очень часто используется возможность динамического переключения между разрешениями без сигнализации об изменении или требования отдельного динамического типа полезной нагрузки.

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

Ссылки:

  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 magic.Либо ваш декодер способен понять изменение параметра H264, и тогда все в порядке, либо вам нужно остановить перезапуск всего этого, и тогда достаточно динамического sdp.

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

Вы можете либо выполнить динамическое изменение полезной нагрузки, либо изменить набор параметров в потоке, либо повторно ПРИГЛАСИТЬ SIP.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top