gpt4 book ai didi

swift - 如何在Swift中从内存播放[Int16]音频样本数组

转载 作者:行者123 更新时间:2023-12-03 01:14:49 28 4
gpt4 key购买 nike

尝试使用GME库为Mac构建游戏音乐播放器(NSF,SPC等)。
我花了几个小时在SO上测试了如此多的解决方案和技巧,但似乎没有一种解决方案能很好地工作。我尝试了AVAudioEngine/AVAudioPlayerNode/scheduleBuffer路由的许多变体,但是由于它们都不起作用,因此我仅切换到将样本转换为Wav数据并从内存播放。但是,确实可行,将[Int16]转换为[UInt8](以便为wave数组创建数据)非常慢。至少对于更高的采样率和长于几秒钟的歌曲而言。下面的“干净”代码示例。反馈和建议非常欢迎。
经测试:

  • AVAudioPlayerNode example(无法工作,例如找不到输入设备,没有声音等)
  • Buffer to wav data example(有效,但使用sloooow)
  • override func viewDidLoad() {
    super.viewDidLoad()

    gme_type_list()

    var emu = gme_new_emu( gme_nsf_type, 48000 ) // 48kHz
    gme_open_file("path-to-file-on-disk.nsf", &emu, 48000) // 48kHz

    let sampleCount: Int32 = 150 * 48000 * 2 // 150 = Lenght in sec, 48kHz
    var output = Array<Int16>.init(repeating: 0, count: sampleCount)

    gme_start_track(emu, 0)
    gme_play(emu, sampleCount, &output) // Generates *sampleCount* samples in Int16 format

    let samples = output.withUnsafeBufferPointer { buffer -> Array<Int16> in
    var result = [Int16]()
    for i in stride(from: buffer.startIndex, to: buffer.endIndex, by: 2) {
    result.append(buffer[i])
    }
    return result
    }

    // Calls a slightly modified version of example 2 above
    // (to support own samples, in Int16 rather than Float).
    // Works! But "fillWave" method is soooo slow!
    play(samples: samples)
    }

    最佳答案

    快速浏览了SDL库及其audio capabilities。似乎您可以只提供所需的任何缓冲区类型,并且可以正常工作:

    var desiredSpec = SDL_AudioSpec()
    desiredSpec.freq = 48000
    desiredSpec.format = SDL_AudioFormat(AUDIO_S16) // Specify Int16 as format
    desiredSpec.samples = 1024

    var obtainedSpec = SDL_AudioSpec()

    SDL_OpenAudio(&desiredSpec, &obtainedSpec)
    SDL_QueueAudio(1, samples, Uint32(sampleCount)) // Samples and count from original post
    SDL_PauseAudio(0) // Starts playing, virtually no lag!
    仍将感谢您对原始帖子/问题的任何反馈,但是就解决方案而言,我认为这比任何帖子都好(或更好)。

    关于swift - 如何在Swift中从内存播放[Int16]音频样本数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62864609/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com