Недавно я играл с рубином, и я решил запустить простой проект для записи рубинового скрипта, который записывает линейный звук в файл .wav
. Я обнаружил, что Ruby не обеспечивает очень хороший доступ к аппаратным устройствам (и это, вероятно, не стоит), но это PortAudio делает, и я обнаружил отличную оболочку для PA here (это не самоцвет, я думаю, потому что он использует рубины ffi
для подключения к PortAudio, а библиотека PA может быть в разных местах). Я пытался запутаться в документации и примерах PortAudio, чтобы выяснить, как работает PA. Я не писал или читал C
годами.Использование обложек PortAudio в рубине для записи звука в .wav
Я сталкиваюсь с трудностями с тем, какие параметры я должен передавать в поток во время создания, и буфер во время создания. Например, что такое 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
Если я буду записывать, я должен читать поток в буфер, а затем манипулировать этот буфер и записи его в файл, верно?
Кроме того, если я лаю по неправильному дереву здесь, и есть более простой способ сделать это (в рубине), какое-то направление будет приятным.
Кажется, что связанный (не обманывающий) вопрос здесь http: // stackoverflow.com/questions/2716987/record-audio-through-rtmp-rails –