【发布时间】: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 播放音频,但我不确定如何让它在后台连续播放而不需要睡眠。
【问题讨论】: