4

我目前正在使用 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中的函数使用AudioFileOpenURLAudioFileReadBytes. 有没有办法让框架为我使用ExtAudioFileOpenURL和解码音频ExtAudioFileRead

我在这里尝试过代码:https ://devforums.apple.com/message/10678#10678 ,但我不知道该怎么做。我用来获取缓冲区的函数位于https://developer.apple.com/library/ios/#samplecode/MusicCube/Listings/Classes_MyOpenALSupport_h.html%23//apple_ref/doc/uid/DTS40008978-Classes_MyOpenALSupport_h-DontLinkElementID_9,而且我还没有真正修改它,所以这就是我需要建立的。

我已经开始赏金,因为我真的需要这个,希望有人能指出我正确的方向。

4

5 回答 5

4

您需要使用音频服务来加载其他格式。请记住,OpenAL 仅支持未压缩的 PCM 数据,因此您加载的任何数据都需要在加载期间进行解压缩。

这是一些将加载 iOS 支持的任何格式的代码:https ://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/Support/OALAudioFile.m

如果要流式传输压缩的音轨类型的音频,请使用 AVAudioPlayer,因为它直接从磁盘播放压缩音频。

于 2011-07-13T19:26:52.063 回答
3

您不需要任何第三方库来打开存档文件。借助 AudioToolbox/AudioToolbox.h框架的一些帮助,您可以打开和读取.caf文件的数据,顺便说一下,就性能(解压缩过程中对 CPU 的影响最小)而言,这是一个非常好的选择(比 mp3 或 ogg 更好)。因此,当数据到达 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;
}
于 2011-07-24T00:32:37.557 回答
1

根据上面 Karl 的回复,我制作了一个最小的单个 c++ 函数,它打开一个文件并为您返回一个 pcm 音频缓冲区(适用于 OpenAL)以及创建 OpenAL 声音所需的所有信息(格式、采样率、缓冲区大小等) .

您需要的两个文件在这里: https ://gist.github.com/ofTheo/5171369

希望能帮助到你!西奥

于 2013-03-15T17:02:56.183 回答
0

试试这是否可行:http: //kcat.strangesoft.net/openal-tutorial.html

于 2011-07-17T13:23:10.000 回答
0

您可以尝试使用第三方库将 mp3-ogg 加载到 char* 缓冲区中,然后将此缓冲区提供给 openAL。这将解决文件大小问题。

对于 ogg,您应该在他们的网站上找到这些库

对于 mp3,老实说,我不知道在哪里可以找到可以做到这一点的轻量级库。但这应该存在。

于 2011-07-23T22:54:59.000 回答