2012-03-24 35 views
1

我正在使用一個系統推出我想要播放的tmp目錄中的原始音頻文件。我的Linux發行版有一些錯誤,每次使用實用程序播放某些音頻時(例如mplayer,sox等),都會導致暫停兩秒鐘。作爲一種解決方法,我想在不停頓的情況下連續播放音頻文件。如何排列一組來自bash的原始音頻文件

我對系統的控制很少。只要計算機處於啓動狀態,系統就會啓動,但文件將以突發形式傳播。系統創建文件,運行您指定的腳本,然後刪除文件。我可以移動文件,將其轉換,但我希望它變得簡單和優雅。我想有一種方法可以將文件推送到隊列中播放文件,而無需關閉聲卡的會話,所以我不會感到煩人的延遲。

我在想像GStreamer或VLC可以工作。有什麼建議麼?

更新:如果您投票結束該問題,請告訴我具體爲什麼。這是bash編程語言的一個編程問題。

+3

「我的Linux發行版有一些bug」 [來源] – 2012-03-24 04:31:29

+0

你應該張貼關於發行版的跟蹤器的錯誤報告,並看看如何去:)。 – Corbin 2012-03-24 04:38:11

+0

我也在研究這個bug的修復方法,但是如上所述的使用bash的解決方法是這篇特定文章的原因。我想有一個簡單的解決方法,我可以在幾分鐘內應用而不需要一些驅動程序或內核補丁。 – User1 2012-03-24 12:42:51

回答

1

我會建議使用VLC,因爲你可以使用shell腳本調用http://wiki.videolan.org/Console

的Gstreamer本身不適合播放列表式的應用程序開箱即用VLC的命令行界面排隊文件 - 一個基於gstreamer的解決方案,您最好使用使用gstreamer作爲後端的播放器。但首先嚐試VLC。

問候

+0

感謝您的提示。但是,由於某些原因,VLC無法正確播放這些文件。如果我只是運行'cvlc testfile.wav',它會截斷最後的0.5秒左右。我也嘗試了使用-idle開關的mplayer,但如果長時間處於非活動狀態,則進程將停止。任何其他程序,你可以推薦? – User1 2012-03-25 04:41:21

0

你可以使用的GStreamer與playbin2元素寫一點Python應用程序。 Playbin2支持無間隙播放,您可以在其中準備下一個正在播放的白色文件。使用播放器命令調用從腳本播放多個文件將導致間隙,除非該命令將文件置入運行實例。

1

不要以爲這是可能的普通gst啓動,但你可以用python和pygst做到這一點。 只要處理MESSAGE_EOS並更新uri屬性與下一個文件。

這裏是pygst tutorial例2.3(這你想要做什麼,但增加了〜文件之間0.5秒的延遲)修改後的代碼:

#!/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()