2011-07-13 44 views
4

我目前使用OpenAL玩游戏音乐。它工作正常,但除了原始WAV文件之外,它不能工作。这意味着我最终会有一个〜9mb的配乐。AudioToolbox/OpenAL ExtAudioFile播放压缩音频

我是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)即可。我想这样做(显然)的唯一原因是减小文件大小。

编辑:看来,这个问题并没有像我用来获取缓冲区的方法那么多。 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。有什么办法可以让框架为我解码音频ExtAudioFileOpenURLExtAudioFileRead

我试过这里的代码: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,我没有真正修改它,所以这就是我需要建立的。

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

+0

你真的不得不用纯粹的OpenAL来播放你的声音吗?你为什么不使用像CocosDenshion这样的盒子,这将为你节省大量的后顾之忧。 http://www.cocos2d-iphone.org/wiki/doku.php/cocosdenshion:faq –

回答

4

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

下面是一些代码,可以加载的iOS支持的任何格式:如果要传输压缩的电影配乐式音频,使用AVAudioPlayer因为它起到压缩音频直接从磁盘https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/Support/OALAudioFile.m

+0

如果我使用这个,我该如何引用/赞扬它? – Greg

+0

这是我自己的代码。只需在您的信息来源的评论中留下原始链接,这就足够了。 – Karl

+0

如果此源代码在App Store上的iPhone应用程序中编译完成? – Greg

0

您可以尝试使用第三方库,一个MP3 OGG加载到一个char *缓冲区,然后这个缓冲区的OpenAL。这将解决文件大小问题。

对于OGG,你应该找到自己的website

对于MP3的图书馆,我真的不知道在哪里可以找到一个轻量级的库,它可以这样做。但是这应该存在。

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; 
} 
1

基于卡尔的答复上面,我做这将打开一个文件,并给你回PCM音频的缓冲器(适用于OpenAL的)最小的一个C++函数以及创建OpenAL声音所需的所有信息(格式,采样率,缓冲区大小等)。

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

希望它能帮助! theo