我目前正在使用OpenAL来播放游戏音乐。它工作得很好,只是除了原始的WAV文件之外,它不适用于任何东西。这意味着我最终会有一张9MB的音轨。
我是OpenAL新手,我直接使用苹果示例(9)中的代码来获取缓冲区数据。
问:是否有任何方法来修改这个功能,让它读取压缩音频并对其进行动态解码?
我不太担心音频文件格式,只要它可以播放和压缩(如mp3,aac,caf)。我想这么做的唯一原因(很明显)是为了减少文件大小。
编辑:,与其说问题在OpenAL中,不如说是我用来获取缓冲区的方法。9的函数使用AudioFileOpenURL和AudioFileReadBytes。有没有办法让框架用ExtAudioFileOpenURL和ExtAudioFileRead为我解码音频?
我试过这里的代码:https://devforums.apple.com/message/10678#10678,但我不知道该怎么做。我用来获取缓冲区的函数位于9,而且我还没有对它进行真正的修改,所以这就是我需要构建的。
我已经开始赏金了,因为我真的需要这个,希望有人能给我指明正确的方向。
发布于 2011-07-13 19:26:52
您需要使用音频服务来加载其他格式。请记住,OpenAL只支持未压缩的PCM数据,因此您加载的任何数据都需要在加载期间解压缩。
下面是一些代码,它将加载iOS:https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/Support/OALAudioFile.m支持的任何格式
如果您想要流压缩原声音轨类型的音频,请使用AVAudioPlayer,因为它直接从磁盘播放压缩音频。
发布于 2011-07-24 00:32:37
您不需要任何第三方库来打开归档文件。在AudioToolbox/AudioToolbox.h框架的帮助下,您可以打开和读取.caf文件的数据,这是一个非常好的选择(在性能方面优于mp3或ogg) (解压缩过程中对CPU的影响最小)。因此,当数据到达OpenAL时,它已经是PCM,可以填充缓冲区了。下面是一些关于如何实现这一目标的示例代码:
-(void) prepareFiles:(NSString *) filePath{
// get the full path of the file
NSString* fileName = [[NSBundle mainBundle] pathForResource:filePath ofType:@"caf"];
// open the file using the custom created methods (see below)
AudioFileID fileID = [self openAudioFile:fileName];
preparedAudioFileSize = [self audioFileSize:fileID];
if (preparedAudioFile){
free(preparedAudioFile);
preparedAudioFile = nil;
}
else{
;
}
preparedAudioFile = malloc(preparedAudioFileSize);
//read the data from the file into soundOutData var
AudioFileReadBytes(fileID, false, 0, &preparedAudioFileSize, preparedAudioFile);
//close the file
AudioFileClose(fileID);
}
-(AudioFileID)openAudioFile:(NSString*)filePath
{
AudioFileID fileID;
NSURL * url = [NSURL fileURLWithPath:filePath];
OSStatus result = AudioFileOpenURL((CFURLRef)url, kAudioFileReadPermission, 0, &fileID);
if (result != noErr) {
NSLog(@"fail to open: %@",filePath);
}
else {
;
}
return fileID;
}
-(UInt32)audioFileSize:(AudioFileID)fileDescriptor
{
UInt64 outDataSize = 0;
UInt32 thePropSize = sizeof(UInt64);
OSStatus result = AudioFileGetProperty(fileDescriptor, kAudioFilePropertyAudioDataByteCount, &thePropSize, &outDataSize);
if(result != 0) NSLog(@"cannot find file size");
return (UInt32)outDataSize;
}发布于 2013-03-15 17:02:56
基于卡尔上面的答复,我做了一个最小的c++函数,它打开一个文件并返回一个pcm音频缓冲区(适合OpenAL )和创建OpenAL声音所需的所有信息(格式、样本、缓冲区大小等)。
您需要的两个文件在这里:https://gist.github.com/ofTheo/5171369
希望能帮上忙!西奥
https://stackoverflow.com/questions/6673051
复制相似问题