Как поставить в очередь набор необработанных аудиофайлов из bash - PullRequest
1 голос
/ 24 марта 2012

Я использую систему, которая выталкивает необработанные аудиофайлы в каталог tmp, который я хочу воспроизвести. В моем дистрибутиве Linux есть какая-то ошибка, которая вызывает паузу на две секунды каждый раз, когда вы проигрываете аудио с помощью утилиты (например, mplayer, sox и т. Д.). В качестве обходного пути я хочу непрерывно воспроизводить аудиофайлы без этой паузы.

У меня очень мало контроля над системой. Система будет работать всякий раз, когда компьютер включен, но файлы будут передаваться пакетами. Система создает файлы, запускает указанный вами сценарий и затем удаляет файл. Я могу переместить файл, преобразовать его, что угодно, но я хочу, чтобы он был простым и элегантным. Я думаю, что был бы какой-то способ поместить файлы в очередь, которая будет воспроизводить файл, не закрывая сеанс для звуковой карты, поэтому я не получаю эту досадную задержку.

Я думаю, что-то вроде GStreamer или VLC может работать. Есть предложения?

Обновление: если вы проголосуете, чтобы закрыть этот вопрос, скажите, пожалуйста, почему. ЭТО ПРОГРАММИРУЮЩИЙ ВОПРОС для языка программирования bash ... простой и понятный.

Ответы [ 3 ]

1 голос
/ 03 апреля 2012

Не думайте, что это возможно с простым gst-launch, но вы можете сделать это с помощью 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()
1 голос
/ 24 марта 2012

Я бы предложил использовать VLC, потому что вы можете ставить файлы в очередь, используя сценарий оболочки, который вызывает интерфейс командной строки VLC http://wiki.videolan.org/Console

Сам Gstreamer не подходит для приложений в стиле списка воспроизведения из коробки- для решения на основе gstreamer лучше использовать плеер, использующий gstreamer в качестве бэкэнда.Но сначала попробуйте VLC.

С уважением

0 голосов
/ 25 марта 2012

Вы можете написать небольшое приложение на python, используя gstreamer с элементом playbin2.Playbin2 поддерживает воспроизведение без пауз, где вы можете подготовить следующий файл, который воспроизводится белым.Воспроизведение нескольких файлов из сценария с использованием вызова команды проигрывателя обычно вызывает пропуски, если только команда не запишет файлы в работающий экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...