He estado jugando con ruby recientemente, y decidí comenzar un proyecto simple para escribir un script de ruby que registra el sonido de entrada de línea en un archivo .wav
. Descubrí que el ruby no proporciona un acceso muy bueno a los dispositivos de hardware (y probablemente no debería), pero que PortAudio sí, y descubrí una excelente envoltura para PA here (no es una joya, creo que porque usa ruby's ffi
para adjuntar a PortAudio, y la biblioteca de PA podría estar en una variedad de lugares). He estado pasando por la documentación y ejemplos de PortAudio para descubrir cómo funciona la PA. No he escrito ni leído C
en años.Usando el envoltorio de PortAudio en ruby para grabar sonido en .wav
Tengo problemas con los parámetros que debería pasar a una secuencia durante la creación, y un buffer durante la creación. Por ejemplo, qué es exactamente un frame
, y cómo se relaciona con otros parámetros como channel
y sample rate
. También soy totalmente nuevo en la programación de audio en general, así que si alguien pudiera indicarme algunos tutoriales generales, etc., sobre audio a nivel de dispositivo, lo agradecería.
ruby-portaudio
proporciona un único ejemplo que crea una secuencia y un búfer, escribe una onda sinusoidal en el búfer y luego envía el búfer al flujo que se va a reproducir. Parte del rubí con el que estoy teniendo problemas en el ejemplo, específicamente el bloque de bucle.
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
Si voy a estar grabando, yo debería estar leyendo una corriente en un buffer, y luego manipular ese búfer y escribirlo en un archivo, ¿verdad?
Además, si estoy ladrando el árbol equivocado aquí, y hay una manera más fácil de hacer esto (en rubí), una dirección sería agradable.
Parece ser una pregunta relacionada (no engañosa) aquí http: // stackoverflow.com/questions/2716987/recording-audio-through-rtmp-rails –