2

最終的にruby​​-alsa ライブラリを参照するコードを取得しましたが、また行き詰まりました。最終的には、クライアント側からアクションが呼び出されたときに、サーバーでオーディオ ファイルを再生したいと考えています。そのため、コントローラーに次のコードがあります。

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 メソッドを使用してみました (上記のコードに注意してください)。上記のコードは構文的に正しいです。ただし、1 マイクロ秒だけサウンドを再生してから停止します。私の推測では、リクエストがすぐに終了するため、認識できるものを再生する時間が十分にありません。

前述のように、私の最終的な目標は、サーバーでオーディオを再生するアクションをエンド ユーザーに呼び出させることです。ファイルは、HTTP 要求の最後で再生を停止するべきではありません。再生を停止する別のアクションが呼び出されるまで続行する必要があります。それを知っているので、誰かが write_in_background メソッドを呼び出すための構文とパラメーターを正しく取得するのを手伝ってくれませんか? 残念ながら、現時点で私が持っているruby ​​-alsa のドキュメントは、(Ruby の完全な初心者として) 私にとって十分に役に立ちませんでした。

更新:上記の書き込みメソッドの呼び出しを 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

ここで起こっていることの組み合わせがあるようです。1 つ目は、サンプル レート (長さ == 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

この時点で、ルビー コードで 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

編集:OK、それがうまくいかない場合は、すでに独自のスレッドを開始していると思います。しばらく寝てはどうですか?初挑戦:

  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 に答える