Ostatnio grałem z rubinem i postanowiłem rozpocząć prosty projekt napisania skryptu ruby, który nagrywa dźwięk line-in do pliku .wav
. Odkryłem, że ruby nie zapewnia bardzo dobrego dostępu do urządzeń (i prawdopodobnie nie powinien), ale PortAudio to robi, i odkryłem wspaniałe opakowanie dla PA here (to nie jest klejnot, myślę, że ponieważ używa ruby ffi
, aby dołączyć do PortAudio, a biblioteka PA może znajdować się w różnych miejscach). Przekręcałem dokumentację i przykłady PortAudio, aby dowiedzieć się, jak działa PA. Nie pisałem ani nie czytałem w ciągu ostatnich lat C
.Używanie opakowania PortAudio w Ruby do nagrywania dźwięku do .wav
Występują problemy z parametrami, które powinienem przekazać do strumienia podczas tworzenia i bufor podczas tworzenia. Na przykład, czym dokładnie jest frame
i jak jest on powiązany z innymi parametrami, takimi jak channel
i sample rate
. Zupełnie nowy jestem także w dziedzinie programowania audio, więc jeśli ktoś mógłby wskazać mi ogólne samouczki, itp., Na temat dźwięku na poziomie urządzenia, byłbym wdzięczny.
ruby-portaudio
dostarcza pojedynczy przykład, który tworzy strumień i bufor, zapisuje falę sinową w buforze, a następnie wysyła bufor do odtwarzanego strumienia. Niektóre ruby, z którymi mam problem w tym przykładzie, w szczególności blok pętli.
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
Jeśli mam być zapis, że należy czytać strumień do bufora, a następnie manipuluje, że bufor i pisanie go złożyć, tak?
Ponadto, jeśli szczeszczę złe drzewo tutaj, i jest łatwiejszy sposób na zrobienie tego (w rubinach), pewien kierunek byłby miły.
Wydaje się być pokrewnym (nie dupe) pytanie tutaj http: // stackoverflow.com/questions/2716987/recording-audio-through-rtmp-rails –