0

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.

Répondre

0

Une question à la fois:

1) Comment est-il différent de gst-launch-1.0? Il est difficile de dire sans voir votre code complet, mais je vais essayer de deviner: gst-launch-1.0 fait une liaison correcte. Lorsque vous avez un muxer comme vous le faites, vous ne pouvez pas le lier directement car il est créé sans aucun tampon. Vous devez en demander un à créer avant de pouvoir créer un lien. Jetez un oeil aux pads dynamiques: https://gstreamer.freedesktop.org/documentation/application-development/basics/pads.html

De plus, gst-launch-1.0 a une gestion des erreurs, il vérifie donc que chaque action a réussi et signale une erreur. Je vous recommande d'ajouter un gestionnaire de messages GstBus pour être averti au moins des messages d'erreur. Aussi, vous devriez vérifier le retour pour les fonctions que vous appelez dans GStreamer, ce qui vous permettrait d'attraper cette erreur de liaison dans votre programme.

2) Débogage Gstreamer? La plupart du temps fait en définissant la variable GST_DEBUG: https://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html#the-debug-log

exécuter votre application avec: GST_DEBUG=6 ./yourapplication et vous devriez voir beaucoup de l'exploitation forestière.