我最近一直在玩 ruby,我决定开始一个简单的项目来编写一个 ruby 脚本,将 line-in 声音记录到.wav
文件中。我发现 ruby 不能很好地访问硬件设备(它可能不应该),但是 PortAudio 可以,我在这里发现了一个很棒的 PA 包装器(我认为它不是宝石,因为它使用了 rubyffi
附加到 PortAudio,PA 库可以在各种地方)。我一直在摸索 PortAudio 的文档和示例,以了解 PA 的工作原理。我已经很多年没有写作或阅读C
了。
我在创建过程中应该将哪些参数传递给流以及在创建过程中传递给缓冲区时遇到了困难。例如,a 到底是什么frame
,它与 和 等其他参数有什么channel
关系sample rate
。一般来说,我对音频编程也完全陌生,所以如果有人能指出一些关于设备级音频的一般教程等,我将不胜感激。
ruby-portaudio
提供了一个创建流和缓冲区的示例,将正弦波写入缓冲区,然后将缓冲区发送到要播放的流。我在示例中遇到的一些红宝石,特别是循环块。
PortAudio.init
block_size = 1024
sr = 44100
step = 1.0/sr
time = 0.0
stream = PortAudio::Stream.open(
:sample_rate => sr,
:frames => block_size,
:output => {
:device => PortAudio::Device.default_output,
:channels => 1,
:sample_format => :float32
})
buffer = PortAudio::SampleBuffer.new(
:format => :float32,
:channels => 1,
:frames => block_size)
playing = true
Signal.trap('INT') { playing = false }
puts "Ctrl-C to exit"
stream.start
loop do
stream << buffer.fill { |frame, channel|
time += step
Math.cos(time * 2 * Math::PI * 440.0) * Math.cos(time * 2 * Math::PI)
}
break unless playing
end
stream.stop
如果我要录制,我应该将流读入缓冲区,然后操作该缓冲区并将其写入文件,对吗?
另外,如果我在这里叫错了树,并且有一种更简单的方法可以做到这一点(在红宝石中),那么一些方向会很好。