2010-08-17 24 views
8

J'écris une application qui utilise les liaisons Python Gstreamer pour lire de l'audio, mais j'essaie maintenant de décoder aussi l'audio, c'est-à-dire d aiment lire les données en utilisant un decodebin et recevoir un tampon PCM brut. Plus précisément, je veux lire des morceaux du fichier de façon incrémentielle plutôt que de lire le fichier entier en mémoire.Utiliser Gstreamer (Python) pour décoder l'audio (vers des données PCM)

Quelques questions spécifiques: Comment puis-je accomplir cela avec Gstreamer? Avec pygst spécifiquement? Existe-t-il un élément "sink" particulier dont j'ai besoin pour lire les données du flux? Y a-t-il un moyen préféré de lire les données d'un pygst Buffer object? Comment puis-je contrôler la vitesse à laquelle je consomme des données (plutôt que d'entrer simplement dans une «boucle principale»)?

+0

Plus de référence future: c'est la solution que j'ai trouvée (avec l'aide d'elmarco), qui pourrait aussi être utile dans d'autres projets. http://github.com/sampsyo/pylastfp/blob/master/lastfp/gstdec.py – adrian

Répondre

5

Pour récupérer les données dans votre application, la méthode recommandée est appsink.

Basé sur un simple lecteur audio comme this one (et remplacer le oggdemux/vorbisdec par decodebin & capsfilter avec des bouchons = "audio/x--int brut"), le changement autoaudiosink à appsink, et connectez "new-buffer" signal à une fonction python + régler "emit-signals" sur True. La fonction recevra des morceaux décodés de données PCM/int. Le taux de décodage dépendra de la vitesse à laquelle vous pouvez décoder et consommer. Étant donné que le nouveau signal de tampon est dans le contexte de thread Gstreamer, vous pouvez simplement dormir/attendre dans cette fonction pour contrôler ou ralentir la vitesse de décodage.

+0

Merci! Je ne savais pas sur appsink. Cela aide beaucoup! – adrian

+2

Une note supplémentaire (pour référence future) après avoir essayé ceci: il semble que vous deviez définir la propriété "sync" de l'application sur false afin d'obtenir les données le plus rapidement possible. Sinon, vous consommerez des données en temps réel. – adrian

+0

correct, j'ai oublié de mentionner cela. – elmarco