【问题标题】:Using ruby-alsa使用 ruby​​-alsa
【发布时间】:2011-06-02 12:35:34
【问题描述】:

我终于把我的代码发到了reference the 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

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

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

更新:如果我将上面对 write 方法的调用替换为对 write_to_background 方法的调用,我会收到以下运行时错误:cannot add pcm handler (Function not implemented)

更新 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 播放音频,但我不确定如何让它在后台连续播放而不需要睡眠。

【问题讨论】:

    标签: ruby alsa


    【解决方案1】:

    在自己的线程上启动它怎么样?

    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
    

    【讨论】:

    • 不幸的是,同样的事情——它会播放一个快速的“哔哔”声,然后立即停止。我想指出我根本不确定我是否正确使用了该库。我刚刚用我自己的文件替换了我在 ruby​​-alsa 主页上找到的引用 $stdin 的示例代码。
    • 有趣的是,除了 HTTP 请求持续时间长了四秒之外,完全相同的“哔哔声”。不是我所期望的。
    猜你喜欢
    • 2017-03-10
    • 2014-09-11
    • 2016-08-28
    • 2015-10-29
    • 2011-01-11
    • 2013-10-14
    • 2013-01-26
    • 2023-03-20
    • 2016-04-23
    相关资源
    最近更新 更多