Lors du développement d'une application audio en continu, j'ai utilisé l'outil de ligne de commande gst-launch-1.0 pour générer un flux de transport MPEG à tester. Cela a fonctionné comme prévu (j'ai pu servir le flux à partir d'un simple serveur http et l'entendre en utilisant le lecteur multimédia VLC). J'ai ensuite essayé de répliquer la partie encodage de ce flux dans le code Python gstreamer. La version Python est connectée au serveur, mais aucun son ne peut être entendu. J'essaie de comprendre pourquoi l'implémentation de la ligne de commande a fonctionné, mais pas celle de Python. Je travaille sur Mac OS 10.11 et Python 2.7.Comment créer un pipeline de flux de transport MPEG2 à l'aide de Python et Gstreamer
La ligne de commande qui a fonctionné était comme suit:
gst-launch-1.0 audiotestsrc freq=1000 ! avenc_aac ! aacparse ! mpegtsmux ! tcpclientsink host=127.0.0.1 port=9999
Le code Python qui a créé le pipeline GStreamer est ci-dessous. Il a instancié sans produire d'erreurs et s'est connecté avec succès au serveur http, mais aucun son n'a pu être entendu via VLC. J'ai vérifié que le AppSrc dans le code Python fonctionnait, en l'utilisant avec un pipeline gstreamer séparé qui a joué l'audio directement. Cela a bien fonctionné.
def create_mpeg2_pipeline():
play = Gst.Pipeline()
src = GstApp.AppSrc(format=Gst.Format.TIME, emit_signals=True)
src.connect('need-data', need_data, samples()) # need_data and samples defined elsewhere
play.add(src)
capsFilterOne = Gst.ElementFactory.make('capsfilter', 'capsFilterOne')
capsFilterOne.props.caps = Gst.Caps('audio/x-raw, format=(string)S16LE, rate=(int)44100, channels=(int)2')
play.add(capsFilterOne)
src.link(capsFilterOne)
audioConvert = Gst.ElementFactory.make('audioconvert', 'audioConvert')
play.add(audioConvert)
capsFilterOne.link(audioConvert)
capsFilterTwo = Gst.ElementFactory.make('capsfilter', 'capsFilterTwo')
capsFilterTwo.props.caps = Gst.Caps('audio/x-raw, format=(string)F32LE, rate=(int)44100, channels=(int)2')
play.add(capsFilterTwo)
audioConvert.link(capsFilterTwo)
aacEncoder = Gst.ElementFactory.make('avenc_aac', 'aacEncoder')
play.add(aacEncoder)
capsFilterTwo.link(aacEncoder)
aacParser = Gst.ElementFactory.make('aacparse', 'aacParser')
play.add(aacParser)
aacEncoder.link(aacParser)
mpegTransportStreamMuxer = Gst.ElementFactory.make('mpegtsmux', 'mpegTransportStreamMuxer')
play.add(mpegTransportStreamMuxer)
aacParser.link(mpegTransportStreamMuxer)
tcpClientSink = Gst.ElementFactory.make('tcpclientsink', 'tcpClientSink')
tcpClientSink.set_property('host', '127.0.0.1')
tcpClientSink.set_property('port', 9999)
play.add(tcpClientSink)
mpegTransportStreamMuxer.link(tcpClientSink)
Ma question est, comment le pipeline GStreamer que j'ai mises en application en Python diffèrent du pipeline de ligne de commande? Et plus généralement, comment débusquez-vous ce genre de chose? Est-ce que gstreamer a un mode "verbeux"?
Merci.