我想与计算机音频的输出接口,并用fft生成该音频的可视化。
我的问题是“我从哪里获得计算机的音频输出流?是否有用于此目的的有用库?”我看过的所有例子都来自文件,这对我来说并不是很有用。
我希望能在golang和linux上工作。
看看http://go-lang.cat-v.org/library-bindings的“图形和音频”部分和“音频”部分。
特别是对PortAudio(http://code.google.com/p/portaudio-go/)和PulseAudio(https://github.com/moriyoshi/pulsego/)的绑定可能对你有用,是一个linux家伙。
我知道这是从不久前开始的,但是如果有人想知道这一点,我一直在努力:https://github.com/padster/go-sound
声音被建模为浮动样本的通道(44.1khz,每个样本在[-1,1]范围内),您可以处理它们,或者例如播放扬声器(目前通过pulsego),使用openGL将它们写入文件或在屏幕上显示。
还有一些实验性的FFT代码(常数Q,类似)
要使用golang播放声音,您可以使用beep:http://github.com/faiface/beep,请参阅the tutorial:
package main
import (
"log"
"os"
"time"
"github.com/faiface/beep"
"github.com/faiface/beep/mp3"
"github.com/faiface/beep/speaker"
)
func main() {
f, err := os.Open("../Lame_Drivers_-_01_-_Frozen_Egg.mp3")
if err != nil {
log.Fatal(err)
}
streamer, format, err := mp3.Decode(f)
if err != nil {
log.Fatal(err)
}
defer streamer.Close()
speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))
done := make(chan bool)
speaker.Play(beep.Seq(streamer, beep.Callback(func() {
done <- true
})))
<-done
}
要记录您的计算机音频(麦克风),您可以尝试本教程:使用PortAudio绑定的https://medium.com/@valentijnnieman_79984/how-to-build-an-audio-streaming-server-in-go-part-1-1676eed93021:
package main
import (
"encoding/binary"
"github.com/gordonklaus/portaudio"
"net/http"
)
const sampleRate = 44100
const seconds = 1
func main() {
portaudio.Initialize()
defer portaudio.Terminate()
buffer := make([]float32, sampleRate * seconds)
stream, err := portaudio.OpenDefaultStream(1, 0, sampleRate, len(buffer), func(in []float32) {
for i := range buffer {
buffer[i] = in[i]
}
})
if err != nil {
panic(err)
}
stream.Start()
defer stream.Close()
}