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

琼斯

尝试使用GME为Mac构建游戏音乐播放器(NSF,SPC等)

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

经测试:

  1. AVAudioPlayerNode示例(无法正常工作,例如,找不到输入设备,没有声音等)
  2. 缓存到WAV数据示例(可以,但是可以使用)

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库及其音频功能似乎您可以只提供所需的任何缓冲区类型,并且可以正常工作:

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!

仍将感谢您对原始帖子/问题的任何反馈,但是就解决方案而言,我认为这比任何帖子都好(或更好)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在样本数组中查找重复值

来自分类Dev

如何在应用关闭的情况下运行后台计时器以在Swift中播放音频样本

来自分类Dev

如何使用Java Sound中的音频样本数据?

来自分类Dev

如何在图例中显示样本数量?

来自分类Dev

如何在图例中显示样本数量?

来自分类Dev

imshow()在Octave中不会显示int16数组

来自分类Dev

如何使用NAudio从mp3中获取音频样本数据

来自分类Dev

如何使用NAudio从mp3中获取音频样本数据

来自分类Dev

如何在榆木中播放音频

来自分类Dev

如何在Winrt中播放重叠的音频?

来自分类Dev

如何在听筒中播放网络音频

来自分类Dev

如何在html5音频和视频播放器中回显php数组?

来自分类Dev

如何在iOS Swift中从URL播放MP3音频

来自分类Dev

如何在音频单元扩展(实时过程)中分配内存以播放音频文件?

来自分类Dev

我如何在播放<video>的同时播放即将到来的5秒钟以上的音频样本?

来自分类Dev

Seaborn如何在sns.catplot中添加每个类别的样本数量

来自分类Dev

如何在joomla 2.5.14中插入自定义样本数据

来自分类Dev

如何使用Python将numpy数组(wav数据)转换为int16?

来自分类Dev

如何轻松地从int32中提取2x int16?

来自分类Dev

如何在int数组中分配内存

来自分类Dev

如何在不使用BitConverter的情况下交换Int16的字节序

来自分类Dev

如何在Dart中将2个字节转换为Int16?

来自分类Dev

在Web Audio中播放原始音频PCM样本

来自分类Dev

如何在文本数组中强制使用空格?

来自分类Dev

如何在react中显示文本数组?

来自分类Dev

如何在Julia中提供可重现的样本数据

来自分类Dev

如何在Node.js中实现简单的音频播放?

来自分类Dev

如何在Surfaceview中隐藏视频并保持音频播放

来自分类Dev

如何在表格中显示WordPress音频播放器

Related 相关文章

  1. 1

    如何在样本数组中查找重复值

  2. 2

    如何在应用关闭的情况下运行后台计时器以在Swift中播放音频样本

  3. 3

    如何使用Java Sound中的音频样本数据?

  4. 4

    如何在图例中显示样本数量?

  5. 5

    如何在图例中显示样本数量?

  6. 6

    imshow()在Octave中不会显示int16数组

  7. 7

    如何使用NAudio从mp3中获取音频样本数据

  8. 8

    如何使用NAudio从mp3中获取音频样本数据

  9. 9

    如何在榆木中播放音频

  10. 10

    如何在Winrt中播放重叠的音频?

  11. 11

    如何在听筒中播放网络音频

  12. 12

    如何在html5音频和视频播放器中回显php数组?

  13. 13

    如何在iOS Swift中从URL播放MP3音频

  14. 14

    如何在音频单元扩展(实时过程)中分配内存以播放音频文件?

  15. 15

    我如何在播放<video>的同时播放即将到来的5秒钟以上的音频样本?

  16. 16

    Seaborn如何在sns.catplot中添加每个类别的样本数量

  17. 17

    如何在joomla 2.5.14中插入自定义样本数据

  18. 18

    如何使用Python将numpy数组(wav数据)转换为int16?

  19. 19

    如何轻松地从int32中提取2x int16?

  20. 20

    如何在int数组中分配内存

  21. 21

    如何在不使用BitConverter的情况下交换Int16的字节序

  22. 22

    如何在Dart中将2个字节转换为Int16?

  23. 23

    在Web Audio中播放原始音频PCM样本

  24. 24

    如何在文本数组中强制使用空格?

  25. 25

    如何在react中显示文本数组?

  26. 26

    如何在Julia中提供可重现的样本数据

  27. 27

    如何在Node.js中实现简单的音频播放?

  28. 28

    如何在Surfaceview中隐藏视频并保持音频播放

  29. 29

    如何在表格中显示WordPress音频播放器

热门标签

归档