来自 OS 的音频流
Audio Streaming from OS
我想连接我计算机的音频输出并使用 fft 生成该音频的可视化。
我的问题是"Where do I get the audio output stream of my computer? Are there any useful libraries for this purpose?"我看过的所有示例都是从文件中流式传输的,这对我来说不是很有用。
我希望在 golang 和 linux 工作。
查看 http://go-lang.cat-v.org/library-bindings 的 "Graphics and Audio" 和 "Audio" 部分。
特别是与 PortAudio (http://code.google.com/p/portaudio-go/) and 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 , see 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
}
要录制计算机音频(麦克风),您可以尝试此教程:https://medium.com/@valentijnnieman_79984/how-to-build-an-audio-streaming-server-in-go-part-1-1676eed93021 使用 PortAudio 绑定:
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()
}
我想连接我计算机的音频输出并使用 fft 生成该音频的可视化。
我的问题是"Where do I get the audio output stream of my computer? Are there any useful libraries for this purpose?"我看过的所有示例都是从文件中流式传输的,这对我来说不是很有用。
我希望在 golang 和 linux 工作。
查看 http://go-lang.cat-v.org/library-bindings 的 "Graphics and Audio" 和 "Audio" 部分。
特别是与 PortAudio (http://code.google.com/p/portaudio-go/) and 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 , see 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
}
要录制计算机音频(麦克风),您可以尝试此教程:https://medium.com/@valentijnnieman_79984/how-to-build-an-audio-streaming-server-in-go-part-1-1676eed93021 使用 PortAudio 绑定:
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()
}