AudioToolbox/OpenAL ExtAudioFile 播放压缩音频
我目前正在使用 OpenAL 来播放游戏音乐。它工作得很好,只是它不能处理除原始 WAV 文件之外的任何内容。这意味着我最终得到了约 9mb 的配乐。
我是 OpenAL 新手,我直接使用 Apple 示例中的代码 (https://developer.apple.com/library/ios/#samplecode/MusicCube/Listings/Classes_MyOpenALSupport_h.html%23//apple_ref/doc/uid/DTS40008978-Classes_MyOpenALSupport_h-DontLinkElementID_9)获取缓冲区数据。
问题:有没有办法修改此函数,以便它读取压缩音频并即时解码?
我不太担心音频文件格式,只要它可以播放并且被压缩即可(如 mp3、aac、caf)。我想这样做的唯一原因(显然)是为了减少文件大小。
编辑:看来问题不在于 OpenAL 中,而在于我用来获取缓冲区的方法。该函数位于 https://developer.apple.com/library/ios/#samplecode/MusicCube/Listings/Classes_MyOpenALSupport_h.html%23//apple_ref/doc/uid/DTS40008978-Classes_MyOpenALSupport_h-DontLinkElementID_9使用AudioFileOpenURL
和音频文件读取字节
。有没有办法让框架使用 ExtAudioFileOpenURL 和 ExtAudioFileRead 为我解码音频?
我在这里尝试过代码: https://devforums.apple.com/message/10678#10678< /a>,但我不知道该怎么做。我用来获取缓冲区的函数位于 https://developer.apple.com/library/ios/#samplecode/MusicCube/Listings/Classes_MyOpenALSupport_h.html%23//apple_ref/doc/uid/DTS40008978-Classes_MyOpenALSupport_h-DontLinkElementID_9,我还没有真正修改过它,所以这就是我需要构建的基础。
我已经开始赏金,因为我真的需要这个,希望有人能指出我正确的方向。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您需要使用音频服务来加载其他格式。请记住,OpenAL 仅支持未压缩的 PCM 数据,因此您加载的任何数据都需要在加载过程中解压缩。
下面是一些可以加载 iOS 支持的任何格式的代码: https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/Support/OALAudioFile.m
如果您想流压缩音轨类型的音频,请使用 AVAudioPlayer,因为它直接从磁盘播放压缩音频。
You'll need to use audio services to load other formats. Bear in mind that OpenAL ONLY supports uncompressed PCM data, so any data you load needs to be uncompressed during load.
Here's some code that will load any format supported by iOS: https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/Support/OALAudioFile.m
If you want to stream compressed soundtrack-type audio, use AVAudioPlayer since it plays compressed audio straight from disk.
您不需要任何第三方库来打开存档文件。在
AudioToolbox/AudioToolbox.h
框架的帮助下,您可以打开并读取.caf
文件的数据,顺便说一句,这是一个非常好的选择(比 mp3 更好)或 ogg)在性能方面(解压过程中对 CPU 的影响最小)。因此,当数据到达 OpenAL 时,它已经是PCM
,准备填充缓冲区。以下是一些有关如何实现此目标的示例代码:You don't need any third party library to open archived files. With a little help from
AudioToolbox/AudioToolbox.h
framework you can open and read the data of a.caf
file which is a very good choice by the way (better than mp3 or ogg) in terms of performance (minimal CPU impact during decompression). So ,when the data gets to OpenAL it is alreadyPCM
, ready to fill the buffers. Here is some sample code on how you can achieve this:根据上面 Karl 的回复,我做了一个最小的单个 C++ 函数,它打开一个文件并返回一个 pcm 音频缓冲区(适合 OpenAL)以及创建 OpenAL 声音所需的所有信息(格式、采样率、缓冲区大小等) 。
您需要的两个文件在这里:
https://gist.github.com/ofTheo/5171369
希望有帮助!
西奥
based on Karl's reply above, I made a minimal single c++ function which opens a file and gives you back a buffer of pcm audio ( suitable for OpenAL ) and all the info you need to create an OpenAL sound ( format, samplerate, buffersize etc ).
the two files you need are here:
https://gist.github.com/ofTheo/5171369
hope it helps!
theo
尝试一下是否有效:http://kcat.strangesoft.net/openal-tutorial.html
Try if this works: http://kcat.strangesoft.net/openal-tutorial.html
您可能会尝试使用第三方库将 mp3-ogg 加载到 char* 缓冲区中,然后将此缓冲区提供给 openAL。这将解决文件大小问题。
对于 ogg,您应该在他们的 网站 上找到库
对于 mp3,我真的不知道哪里可以找到可以做到这一点的轻量级库。但这应该存在。
You might try to use a third party library to load a mp3-ogg into a char* buffer, and then give this buffer to openAL. That would solve the file size problem.
For ogg, you should find the libraries on their website
For mp3, I honestly don't know where to find a lightweight library which could do that. But that should exist.