Gioca flusso video RTP utilizzando Qt?
-
13-09-2019 - |
Domanda
Voglio creare un widget Qt che può giocare in entrata flussi RTP in cui il video è codificato come H264 e non contiene l'audio.
Il mio piano di base per l'attuazione è questa:
- Crea un Phonon MediaSource oggetto (tipo Stream).
- Collegare con un QIODevice sottoclasse che fornisce i dati
- Ottenere i dati video utilizzando:
- Il href="http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib" rel="nofollow noreferrer"> JRTPLIB libreria client
- Il GStreamer gstrtpbin plugin. Questo plugin si occupa depayloading i pacchetti e decodifica del video. Forse questo migliora le possibilità che Phonon riconoscerà i dati.
- Il href="http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib" rel="nofollow noreferrer"> JRTPLIB libreria client
Il mio ambiente:
- Ubuntu 9.10
- Qt 4.6
Le mie domande:
- Il mio approccio una buona? Forse sto affaccia su una soluzione più ovvia o semplice?
- Al momento sto sperimentando questo problema: quando si cerca di riprodurre il video streaming lo stato del mediaobject si rivolge a ErrorState con ERRORE.TIPO FatalError. Qualcuno può dirmi che cosa sto facendo male?
Modifica
Una soluzione che ho trovato sta usando libVLC in combinazione con Qt, che ho imparato a conoscere in questo filo . Ecco un esempio di codice per gli interessati.
Sto ancora cercando una soluzione Phonon-based.
Idealmente avrei solo bisogno di fornire un file SDP e lavoro è fatto.
Soluzione
Sono riuscito a farlo funzionare con la soluzione libVLC. Non posso seguro che questo è il migliore soluzione anche se, come ho semplicemente smesso di cercare dopo.
Ecco un link per il campione libVLC .
Altri suggerimenti
Il modo in cui ho capito Phonon lavora almeno in Windows è che QT offre un plugin fononi backend per DirectShow (\ plugins \ phonon_backend \ phonon_ds94.dll) e GStreamer nel tuo caso. Poi si sarebbe o ottenere o scrivere il proprio filtro DirectShow che può accettare flussi RTP come fonte. DirectShow si occupa della decodifica e Phonon si prenderà cura del rendering.
Quindi, se il backend funziona, il codice dell'applicazione è semplice come:
Phonon::MediaObject *media = new Phonon::MediaObject();
Phonon::VideoWidget *video = new Phonon::VideoWidget();
Phonon::createPath(media, video);
media->setCurrentSource(source);
media->play();
Sembra che il problema si trova con il backend di GStreamer accettare RTP come fonte. Si può riprodurre quella sorgente in GStreamer standalone senza problemi?