2017-05-12 1 views
0

Ich benutze gstreamer (gst-launch-1.0 tatsächlich), um Audio zu empfangen und es mit flacenc zu kodieren. An dieser Stelle für die Prüfung, sieht die Befehlszeile wie folgt:Gstreamer zum Splitten des Audio-Streams in mehrere verkettete aber diskrete Dateien in einem einzelnen Ausgabestream?

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

Dies ist tatsächlich von einem separaten Programm ins Leben gerufen, die die FLAC nativen Format Daten über die stdout des Kindes Prozess bekommt.

Nun, was ich in der Lage sein möchte, zu Archivierungszwecken zu tun, segmentieren diese Audio-Stream in mehrere Dateien von begrenzter Dauer, z. eine Datei pro Minute. Ich habe Code geschrieben, der die minimale Arbeit leistet, die notwendig ist, um den Stream zu analysieren, Audiorahmen zu segmentieren, sie zu puffern und vollständig geformte FLAC-Dateien auszugeben. Auf lange Sicht mache ich mir Sorgen über die CPU-Last, wenn ich Hunderte von Streams archiviere.

Das Hauptproblem ist die Rahmennummer. Es hat eine Codierung mit variabler Länge, und noch schlimmer, es erfordert, dass zwei CRCs für jeden Rahmen neu berechnet werden. Wäre es nicht schön, wenn ich könnte entweder:

  1. gstreamer Haben jeder so oft die Rahmennummer zurückgesetzt, oder noch besser
  2. Have GStreamer eine ganz neue Datei Mitte Stream starten?

Der letztere Fall wäre ideal. Wenn ich dies einfach in eine Datei ablegen würde, wäre das keine gültige FLAC-Datei. Nach dem ersten Segment würde der Leser einen Dateikopf finden, wo er einen Rahmenkopf und Kotze erwartet. Aber ich kann das in meinem Empfangscode behandeln.

Ich arbeite, um herauszufinden, zu versuchen, wie verschiedene Mux und Split-Filter verwenden, aber die meisten Kombinationen habe ich versucht haben Fehler dieser ilk Folge:

WARNING: erroneous pipeline: could not link flacenc0 to splitmuxsink0 

Ich bin mir auch bewusst, dass ich kann, benutze die gstreamer library und mache sowas wahrscheinlich in meinem eigenen code, wo ich die audioquelle in gang halte und den FLAC encoder immer wieder hoch und runter bringe. Vor ein paar Monaten habe ich versucht, im Allgemeinen herauszufinden, wie man Programme schreibt, die mit der gstreamer API verlinken und gerade völlig verloren gegangen sind. Ich schaute wahrscheinlich nicht auf die richtigen Dokumente.

Ich habe auch bisher clevere Wege gefunden, immer das zu tun, was ich mit der gstreamer-Befehlszeile machen wollte. Zum Beispiel habe ich es geschafft, Metadaten von einem FIFO in einen tsmpeg-Stream einzufügen. Vielleicht kann ich dieses Problem auf die gleiche Weise lösen, mit ein wenig Hilfe von netten Stackoverflow-Benutzern. :)

Erläuterung: Ich möchte nicht gstreamer schreiben mehrere Dateien. Ich möchte, dass es mehrere Dateien erzeugt, die aber durch stdout verkettet werden und ein völlig separates Programm in Dateien aufgeteilt haben.

Antwort

0

Der Standardmuxer, der von splitmuxsink ausgewählt wird, ist mp4mux, das flac nicht unterstützt. Wenn Sie muxer = matroskamux als Beispiel verwenden, können Sie splitmuxsink verwenden. Obwohl Sie FLAC enthalten in Matroska, die möglicherweise oder nicht sein können, was Sie wollen.

Während dies wahrscheinlich noch nicht funktioniert, könnten Sie versuchen, Flacparse als Muxer in splitmuxsink verwendbar zu machen, um den Container zu vermeiden.

In der Zwischenzeit können Sie immer einen Container für die Aufteilung verwenden und dann den Container mithilfe der Eigenschaft sink entfernen. Das folgende ist eine Beispielpipeline, die 5 Sekunden flac-Dateien erzeugt.

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

Vielen Dank für den Vorschlag. Ich bin mir nicht sicher, wo es schief geht, aber das erzeugt nur eine Datei. audio00000.flac wird produziert und ist die angeforderte Dauer. audio00001.flac wird erstellt, ist aber immer Null. Das ist sogar ich habe die Dauer auf eine Sekunde eingestellt. –

Verwandte Themen