使用Golang将电脑音频存储到文件中

使用Golang将电脑音频存储到文件中 是否有办法捕获计算机音频并将其存储到文件中?计算机音频可以是任何带有声音的内容,例如YouTube音频、Zoom通话音频。

如果需要更多信息,请告诉我。任何指导都将不胜感激。

1 回复

更多关于使用Golang将电脑音频存储到文件中的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,可以使用Golang捕获计算机音频并存储到文件中。这通常需要调用操作系统的音频接口,以下是一个使用PortAudio库的示例:

package main

import (
    "encoding/binary"
    "os"
    "time"
    
    "github.com/gordonklaus/portaudio"
)

func main() {
    portaudio.Initialize()
    defer portaudio.Terminate()
    
    // 获取默认输入设备
    inputDevice, err := portaudio.DefaultInputDevice()
    if err != nil {
        panic(err)
    }
    
    // 创建WAV文件
    file, err := os.Create("audio.wav")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    
    // 写入WAV文件头
    writeWAVHeader(file, 44100, 16, 1)
    
    // 音频参数
    params := portaudio.HighLatencyParameters(nil, inputDevice)
    params.Input.Channels = 1
    params.SampleRate = 44100
    params.FramesPerBuffer = 1024
    
    // 打开音频流
    stream, err := portaudio.OpenStream(params, func(in []float32) {
        // 将float32转换为int16并写入文件
        for _, sample := range in {
            intSample := int16(sample * 32767)
            binary.Write(file, binary.LittleEndian, intSample)
        }
    })
    if err != nil {
        panic(err)
    }
    
    defer stream.Close()
    
    // 开始录制
    stream.Start()
    
    // 录制10秒
    time.Sleep(10 * time.Second)
    
    stream.Stop()
}

func writeWAVHeader(file *os.File, sampleRate, bitsPerSample, channels int) {
    // WAV文件头结构
    header := make([]byte, 44)
    
    // RIFF标识
    copy(header[0:4], "RIFF")
    // 文件大小(稍后填充)
    binary.LittleEndian.PutUint32(header[4:8], 0)
    copy(header[8:12], "WAVE")
    
    // fmt子块
    copy(header[12:16], "fmt ")
    binary.LittleEndian.PutUint32(header[16:20], 16) // PCM格式
    binary.LittleEndian.PutUint16(header[20:22], 1)  // 音频格式(PCM)
    binary.LittleEndian.PutUint16(header[22:24], uint16(channels))
    binary.LittleEndian.PutUint32(header[24:28], uint32(sampleRate))
    byteRate := sampleRate * channels * bitsPerSample / 8
    binary.LittleEndian.PutUint32(header[28:32], uint32(byteRate))
    blockAlign := channels * bitsPerSample / 8
    binary.LittleEndian.PutUint16(header[32:34], uint16(blockAlign))
    binary.LittleEndian.PutUint16(header[34:36], uint16(bitsPerSample))
    
    // data子块
    copy(header[36:40], "data")
    binary.LittleEndian.PutUint32(header[40:44], 0) // 数据大小(稍后填充)
    
    file.Write(header)
}

这个示例使用PortAudio库捕获系统音频并保存为WAV文件。需要先安装依赖:

go get github.com/gordonklaus/portaudio

注意:在macOS上可能需要安装portaudio库:

brew install portaudio

这个示例会录制10秒的系统音频并保存为audio.wav文件。你可以根据需要调整录制时长、采样率和声道数。

回到顶部