为了账号安全,请及时绑定邮箱和手机立即绑定

PortAudio:在默认帧/缓冲区的播放延迟

PortAudio:在默认帧/缓冲区的播放延迟

Go
叮当猫咪 2021-11-01 17:13:52
我正在尝试使用 PortAudio 在 Go 中异步播放音频。据我所知 PortAudio 处理它自己的线程,所以我不需要使用 Go 的任何内置并发的东西。我正在使用 libsndfile 加载文件(也是 Go 绑定)。这是我的代码:type Track struct {    stream   *portaudio.Stream    playhead int    buffer   []int32}func LoadTrackFilesize(filename string, loop bool, bytes int) *Track {    // Load file    var info sndfile.Info    soundFile, err := sndfile.Open(filename, sndfile.Read, &info)    if err != nil {        fmt.Printf("Could not open file: %s\n", filename)        panic(err)    }    buffer := make([]int32, bytes)    numRead, err := soundFile.ReadItems(buffer)    if err != nil {        fmt.Printf("Error reading from file: %s\n", filename)        panic(err)    }    defer soundFile.Close()    // Create track    track := Track{        buffer: buffer[:numRead],    }    // Create stream    stream, err := portaudio.OpenDefaultStream(        0, 2, float64(44100), portaudio.FramesPerBufferUnspecified, track.playCallback,    )    if err != nil {        fmt.Printf("Couldn't get stream for file: %s\n", filename)    }    track.stream = stream    return &track}func (t *Track) playCallback(out []int32) {    for i := range out {        out[i] = t.buffer[(t.playhead+i)%len(t.buffer)]    }    t.playhead += len(out) % len(t.buffer)}func (t *Track) Play() {    t.stream.Start()}使用这些函数,在初始化 PortAudio 和所有其他函数之后,播放我提供的音轨 - 只是。它非常滞后,并且减慢了我应用程序的其余部分(游戏循环)。但是,如果我将每个缓冲区的帧数更改为FramesPerBufferUnspecified较高的值,例如 1024,则音频播放良好且不会干扰我的应用程序的其余部分。为什么是这样?PortAudio 文档建议使用未指定的值将“选择最佳延迟的值”,但我绝对没有看到这一点。此外,当使用这个非常高的值播放时,我注意到音频中有一些微小的人工制品 - 很小的“爆裂”噪音。我的回调函数或其他任何问题是否有问题,可能会导致这些问题中的一个或两个?我正在使用 OSX 10.10.5、Go 1.3.3 以及来自 Homebrew 的 libsndfile 和 portaudio。
查看完整描述

1 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

转到评论的答案:

始终使用最新版本的 Go 进行测试。

此外,@Joel想通了,你需要使用float32的替代int32


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 317 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信