来自OS的音频流

问题描述 投票:6回答:3

我想与计算机音频的输出接口,并用fft生成该音频的可视化。

我的问题是“我从哪里获得计算机的音频输出流?是否有用于此目的的有用库?”我看过的所有例子都来自文件,这对我来说并不是很有用。

我希望能在golang和linux上工作。

audio go visualization
3个回答
3
投票

看看http://go-lang.cat-v.org/library-bindings的“图形和音频”部分和“音频”部分。

特别是对PortAudio(http://code.google.com/p/portaudio-go/)和PulseAudio(https://github.com/moriyoshi/pulsego/)的绑定可能对你有用,是一个linux家伙。


0
投票

我知道这是从不久前开始的,但是如果有人想知道这一点,我一直在努力:https://github.com/padster/go-sound

声音被建模为浮动样本的通道(44.1khz,每个样本在[-1,1]范围内),您可以处理它们,或者例如播放扬声器(目前通过pulsego),使用openGL将它们写入文件或在屏幕上显示。

还有一些实验性的FFT代码(常数Q,类似)


0
投票

要使用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()
}
© www.soinside.com 2019 - 2024. All rights reserved.