来自 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()
}