2

我终于得到了引用 ruby​​-alsa library 的代码,但我又被卡住了。最终,当从客户端调用操作时,我希望在服务器上播放音频文件。因此,我的控制器中有以下代码:

File.open('./public/audio/test.wav', 'r') do |f|
  ALSA::PCM::Playback.open do |playback|
    playback.write do |length|
      f.read length
    end
  end
end

通过阅读ALSA 库的 RDoc,我得到的印象是我应该使用 ALSA::PCM::Playback 类中的write_in_background 方法。不幸的是,我无法获得正确的语法来使此方法起作用。为了简单地验证我的 ALSA 是否正常工作,我尝试使用 Playback.write 方法(请注意上面的代码)。上面的代码在语法上是正确的;但是,它只播放一微秒的声音,然后停止。我的猜测是请求结束得太快了,它没有足够的时间播放任何可识别的东西。

如前所述,我的最终目标是让最终用户调用一个在服务器上播放音频的操作。该文件不应在 HTTP 请求结束时停止播放——它应该继续播放,直到调用另一个停止播放的操作。知道这一点,有人可以帮助我获得正确的语法和参数来调用 write_in_background 方法吗?恐怕我此时拥有的ruby​​-alsa 文档对我没有足够的帮助(作为 Ruby 的一个完整的新手)。

更新:如果我将上面对 write 方法的调用替换为对 write_to_background 方法的调用,则会出现以下运行时错误:无法添加 pcm 处理程序(未实现功能)

更新 2:我尝试使用不同的 WAV 文件和以下代码,它以扭曲速度播放。

File.open('./public/audio/sample.wav', 'r') do |f|
  ALSA::PCM::Playback.open do |playback|
    playback.write do |length|
      @temp = length
      f.read length
    end
    sleep 4
  end
end

看来这里可能会发生一些事情。我相信第一个是参考采样率(长度 == 44100,即 CD 质量)。我将不得不研究如何以不同的速率播放音频文件。然而,除此之外,我仍然坚持如何让它在后台播放。虽然睡眠证明 ALSA 正在工作,但它在现实世界的场景中并不能很好地工作。

更新 3:让采样率位工作,即使它暂时依赖于一个幻数:

File.open('./public/audio/sample.wav', 'r') do |f|
  ALSA::PCM::Playback.open "default", {:channels => 1, :sample_rate => 11025} do |playback|
    playback.write do |length|
      @temp = length
      f.read length
    end
    sleep 4
  end
end

此时,我的 ruby​​ 代码通过 ALSA 播放音频,但我不确定如何让它在后台连续播放而不需要睡眠。

4

1 回答 1

2

如何在自己的线程上启动它?

Thread.new do
  File.open('myfile.wav', 'rb') do |f|
    ALSA::PCM::Playback.open do |playback|
      playback.write do |length|
        f.read length
     end
    end
  end
end.join

编辑:好的,如果这不起作用,我猜它已经启动了自己的线程。这段时间睡觉怎么样?第一次尝试:

  File.open('myfile.wav', 'rb') do |f|
    ALSA::PCM::Playback.open do |playback|
      playback.write do |length|
        f.read length
     end
    end
  end
  sleep 4 # seconds
于 2011-01-02T16:30:19.163 回答