2017-05-12 1 views
0

J'utilise gstreamer (gst-launch-1.0 en fait) pour recevoir de l'audio et l'encoder en utilisant flacenc. À ce stade, pour le test, la ligne de commande ressemble à ceci:Get gstreamer pour diviser le flux audio en plusieurs fichiers concaténés mais discrets dans un flux de sortie unique?

gst-launch-1.0 -q autoaudiosrc ! flacenc ! fdsink 

Ceci est effectivement lancé par un programme distinct qui reçoit les données de format natif via le FLAC stdout du processus enfant. Maintenant, ce que je veux être en mesure de faire, à des fins d'archivage, est de segmenter ce flux audio en plusieurs fichiers de durée limitée, par ex. un fichier par minute. J'ai écrit du code qui effectue le travail minimal nécessaire pour analyser le flux, segmenter les trames audio, les mettre en mémoire tampon et produire des fichiers FLAC complets. Cependant, à long terme, je suis préoccupé par la charge du processeur une fois que j'archive des centaines de flux.

Le problème principal est le numéro d'image. Il a un encodage de longueur variable, et pire encore, cela nécessite deux CRC à recalculer pour chaque image. Ne serait-il bien si je pouvais soit:

  1. Avez-GStreamer réinitialiser le numéro de cadre tout aussi souvent, ou mieux encore
  2. Have GStreamer commencer une nouvelle mi-parcours de fichier entier?

Ce dernier cas serait idéal. Si je viens de déverser ceci dans un fichier, ce ne serait pas un fichier FLAC valide. Après le premier segment, le lecteur trouverait un en-tête de fichier où il attend un en-tête de cadre et vomir. Mais je peux gérer cela dans mon code de réception.

Je travaille à essayer de comprendre comment utiliser différents filtres MUX et divisés, mais la plupart des combinaisons que j'ai essayé ont donné lieu à des erreurs de cet acabit:

WARNING: erroneous pipeline: could not link flacenc0 to splitmuxsink0 

Je suis aussi conscient que je peux utilisez la librairie gstreamer et faites probablement des trucs comme ça dans mon propre code où je garde la source audio en marche et continue de faire monter et descendre l'encodeur FLAC. Il y a quelques mois, j'ai essayé de comprendre en général comment écrire des programmes qui se lient à l'API de gstreamer et qui ont été complètement perdus. Je ne regardais probablement pas les bons docs.

J'ai également trouvé jusqu'à maintenant des façons intelligentes de toujours faire ce que je voulais faire avec la ligne de commande gstreamer. Par exemple, j'ai réussi à insérer des métadonnées dans un flux tsmpeg depuis un fifo. Alors peut-être que je peux arriver à résoudre ce problème de la même façon, avec l'aide des utilisateurs de stackoverflow. :)

CLARIFICATION: Je ne veux pas que gstreamer écrive plusieurs fichiers. Je veux qu'il génère plusieurs fichiers, mais les faire concaténés en passant par stdout et avoir un programme complètement séparé les diviser en fichiers.

Répondre

0

Le multiplexeur par défaut sélectionné par splitmuxsink est mp4mux, qui ne supporte pas flac. Définir muxer = matroskamux comme exemple vous aidera à utiliser splitmuxsink. Bien que vous aurez FLAC contenu dans matroska, ce qui peut ou peut ne pas être ce que vous voulez.

Bien que cela ne fonctionne probablement pas encore, vous pourriez essayer de rendre flacparse utilisable comme un multiplexeur dans splitmuxsink afin d'éviter le conteneur.

En attendant, vous pouvez toujours utiliser un conteneur pour le fractionnement, puis supprimer le conteneur à l'aide de la propriété sink. Ce qui suit est un exemple de pipeline qui génère des fichiers flac de 5 secondes.

gst-launch-1.0 audiotestsrc ! flacenc ! flacparse ! sm.audio_0 \ 
    splitmuxsink name=sm muxer=matroskamux \ 
         location=audio%05d.flac \ 
         max-size-time=5000000000 \ 
         sink="matroskademux ! filesink" 
+0

Nous vous remercions de votre suggestion. Je ne sais pas où ça va mal, mais cela ne produit qu'un seul fichier. audio00000.flac est produit et correspond à la durée demandée. audio00001.flac est créé mais est toujours nul. C'est même ainsi que je fixe la durée à une seconde. –