Domanda

Vorrei cambiare dinamicamente la sorgente video in un'applicazione video in streaming. Tuttavia, le diverse fonti video hanno dimensioni dell'immagine univoche. Posso generare singoli file SDP per ciascuna sorgente video, ma vorrei combinarli in un singolo file SDP in modo che il client di visualizzazione potesse ridimensionare automaticamente la finestra di visualizzazione al variare della sorgente video. Ecco due esempi di file 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

Come è possibile combinare questi singoli file in un singolo file SDP?

È stato utile?

Soluzione

I parametri nei tuoi due esempi di sdp sono molto vicini: il nome dello stream e i set di parametri sprop differiscono. Presumo che non ti interessi del nome del flusso. Se hai bisogno di set di parametri sprop separati e i client supportano bene lo standard, puoi utilizzare tipi di payload dinamici separati per ogni risoluzione e avere un singolo SDP come segue:

    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

Simile ad altre risposte se in realtà non hai bisogno dei diversi nomi di flusso o dei diversi set di parametri sprop, dovresti essere in grado di utilizzare il tuo primo SDP e cambiare formato a metà flusso. Non conosco l'effettivo payload di H.264 o del tuo particolare decoder abbastanza bene da garantire che funzioni nelle vostre applicazioni, ma è molto comune nelle applicazioni di videoconferenza consentire il passaggio dinamico tra risoluzioni senza segnalare un cambiamento o richiedere una dinamica separata tipo di payload.

Sebbene sia possibile concatenare due documenti SDP come menzionato in un'altra risposta, non credo che in questo caso sarà di aiuto. I decodificatori H.264 possono funzionare solo con un singolo parametro sprop-parameter-sets in un momento in cui credo. Poiché entrambi gli SDP avrebbero lo stesso tipo di payload, porta di origine, ecc., Il destinatario non saprebbe quando utilizzare quale parametro sprop-parametro-imposta. AGGIORNAMENTO: Nota che alcune implementazioni ottengono i loro spargimenti in banda e non dall'SDP (o solo inizialmente dall'SDP). Se questo vale nel tuo ambiente, i set di parametri sprop di SDP possono essere aggiornati in banda

References:

  1. Formato payload RFC 3984 RTP per video H.264
  2. Nuovo formato di payload R.2 H.264 proposto RFC 6184
  3. SDP RFC 4566: protocollo descrizione sessione

[Ci scusiamo per non aver dato la citazione completa - sentiti libero di correggere]

Altri suggerimenti

Ho esaminato la RFC ( RFC2327 - SDP: Protocollo descrizione sessione ) e sembra che tu possa semplicemente concatenare i due documenti SDP. Il documento afferma esplicitamente:

  

Quando SDP viene trasmesso da SAP, è consentita una sola descrizione di sessione per pacchetto. Quando SDP viene trasmesso con altri mezzi, molte descrizioni di sessioni SDP possono essere concatenate insieme (la riga `v = 'che indica l'inizio di una descrizione di sessione termina la descrizione precedente) .

Penso che dipenda dal tuo decodificatore. Se supporta la modifica dei parametri all'interno dello stream, quindi se si può dire all'encoder di inserire l'intestazione corrispondente quando si cambia la risoluzione, il decoder dovrebbe passare automaticamente.

Qual è esattamente la tua domanda? È: come posso modificare la risoluzione senza arrestare / riavviare lo stream?

Non credo che tu possa dire in anticipo a un decodificatore, ecco la potenziale risoluzione che vedrai con un po 'di magia SDP. O il tuo decodificatore è in grado di capire la modifica dei parametri H264, e quindi stai bene, o devi interrompere il riavvio del tutto, e quindi la sdp dinamica è sufficiente.

So che, ad esempio, VLC è in grado di rilevare la modifica della codifica MP4 (ad esempio passando dalla velocità in bit variabile alla velocità in bit costante), ma andrà in crash se si modifica la risoluzione L'unica cosa che puoi fare con sdp è combinare diverse descrizioni dei media, ad esempio con un diverso tipo di payload dinamico e un diverso attributo control-id.

Puoi apportare la modifica dinamica del payload o la modifica del set di parametri in-stream o SIP re-INVITE.

Le modifiche del payload hanno un problema che se non controlli l'encoder e il decoder devi assicurarti che l'altra estremità accetti entrambi i payload e che cambieranno i payload correttamente (e abbastanza velocemente per te - non c'è alcun requisito su quello).

Le modifiche in-stream hanno un problema se i pacchetti del set di parametri vengono persi. È possibile utilizzare un set diverso di set di parametri (passare dal set di parametri 1 a 2 quando si cambia) per evitare errori di decodifica: se i set vengono persi, è necessario ottenere un'immagine congelata o vuota. Consiglierei di ritrasmetterli alcune volte (non in successione troppo rapida).

SIP re-INVITE è out-of-band e handshake, e quindi sicuro, ma aggiunge ritardo a qualsiasi switch e potrebbe presentare anomalie a seconda del ricevitore e potrebbe essere rifiutato.

(Nota: sono un autore di RFC 3984bis, l'aggiornamento a RFC 3984)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top