2012-03-24 14 views
1

Ich benutze ein System, das rohe Audiodateien in das tmp-Verzeichnis, das ich abspielen möchte, rausschiebt. Meine Linux-Distribution hat einen Bug, der jedes Mal, wenn Sie Audio mit einem Dienstprogramm abspielen (zB mplayer, sox usw.), eine Pause von zwei Sekunden verursacht. Als Workaround möchte ich die Audiodateien ohne diese Pause kontinuierlich wiedergeben.Wie man eine Reihe von rohen Audiodateien von Bash ansteht

Ich habe sehr wenig Kontrolle über das System. Das System wird immer eingeschaltet, wenn der Computer eingeschaltet ist, aber Dateien werden in Bursts übertragen. Das System erstellt die Dateien, führt ein von Ihnen angegebenes Skript aus und löscht dann die Datei. Ich könnte die Datei verschieben, konvertieren, was auch immer, aber ich möchte, dass sie einfach und elegant ist. Ich denke, dass es eine Möglichkeit geben würde, die Dateien in eine Warteschlange zu schieben, die die Datei abspielt, ohne die Sitzung auf der Soundkarte zu beenden, so dass ich diese lästige Verzögerung nicht bekomme.

Ich denke, etwas wie GStreamer oder VLC könnte funktionieren. Irgendwelche Vorschläge?

Update: Wenn Sie abstimmen, um diese Frage zu schließen, bitte sagen Sie mir genau warum. Dies ist eine Programmierfrage für die Bash-Programmiersprache .. plain und einfach.

+3

„Mein Linux-Distribution einige Fehler hat“ [Bearbeiten] –

+0

Sie sollten schreiben ein Fehlerbericht über den Tracker der Distro und wie das geht :). – Corbin

+0

Ich bin auch in eine Fehlerbehebung für diesen Fehler suchen, aber eine Problemumgehung mit Bash wie oben beschrieben ist der Grund für diesen bestimmten Beitrag. Ich denke, es gibt eine einfache Problemumgehung, die ich in wenigen Minuten anwenden kann, ohne einige Treiber- oder Kernel-Patches zu benötigen. – User1

Antwort

1

würde ich vorschlagen VLC verwenden, da Sie Dateien mit einem Shell-Skript einreihen können, die die Befehlszeilenschnittstelle von VLC ruft http://wiki.videolan.org/Console

GStreamer sich nicht für Playlist-style-Anwendungen aus der Box geeignet ist - für eine Mit gstreamer basierter Lösung verwenden Sie besser einen Player, der gstreamer als Backend verwendet. Aber versuchen Sie VLC dafür zuerst.

Grüße

+0

Danke für den Tipp. VLC spielt die Dateien aus irgendeinem Grund jedoch nicht richtig ab. Wenn ich einfach 'cvlc testfile.wav' starte, wird die letzte .5 Sekunde oder so abgespielt.Ich habe auch mplayer mit dem Schalter -idle ausprobiert, aber der Prozess stoppt, wenn es längere Zeit inaktiv ist. Irgendwelche anderen Programme, die du empfehlen kannst? – User1

0

Sie könnten eine kleine Python-Anwendung mit GStreamer mit dem playbin2 Element schreiben. Playbin2 unterstützt die lückenlose Wiedergabe, mit der Sie die nächste weiße Datei vorbereiten können. Die Wiedergabe mehrerer Dateien aus einem Skript mit dem Aufruf des Player-Befehls führt natürlich zu Lücken, es sei denn, der Befehl bindet die Dateien an eine laufende Instanz an.

1

Denke nicht, dass es mit dem einfachen gst-launch möglich ist, aber du kannst das mit python und pygst machen. Behandeln Sie einfach MESSAGE_EOS und aktualisieren Sie die Eigenschaft uri mit der nächsten Datei.

Hier modifiziert Code aus pygst tutorial Beispiel 2.3 (das tut, was Sie wollen, aber fügt ~ 0,5s Verzögerung zwischen Dateien):

#!/usr/bin/env python 

import sys, os 
import glib, gobject 
import pygst 
pygst.require("0.10") 
import gst 

class CLI_Main: 
    def __init__(self): 
    self.player = gst.element_factory_make("playbin2", "player") 
    fakesink = gst.element_factory_make("fakesink", "fakesink") 
    self.player.set_property("video-sink", fakesink) 
    bus = self.player.get_bus() 
    bus.add_signal_watch() 
    bus.connect("message", self.on_message) 

    self.currentFile = 1 
    self.play(self.currentFile) 

    def play(self, n): 
     filePath = "file://" + sys.argv[n] 
     self.player.set_property("uri", filePath) 
     self.player.set_state(gst.STATE_PLAYING) 

    def on_message(self, bus, message): 
    t = message.type 
    if t == gst.MESSAGE_EOS: 
     self.player.set_state(gst.STATE_NULL) 
     self.currentFile += 1 
     if self.currentFile < len(sys.argv): 
     self.play(self.currentFile) 
     else: 
     loop.quit() 

    elif t == gst.MESSAGE_ERROR: 
     self.player.set_state(gst.STATE_NULL) 
     err, debug = message.parse_error() 
     print "Error: %s" % err, debug 
     loop.quit() 

mainclass = CLI_Main() 
gobject.threads_init() 
loop = glib.MainLoop() 
loop.run() 
Verwandte Themen