首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioToolbox/OpenAL ExtAudioFile播放压缩音频

AudioToolbox/OpenAL ExtAudioFile播放压缩音频
EN

Stack Overflow用户
提问于 2011-07-13 01:07:13
回答 5查看 3.9K关注 0票数 4

我目前正在使用OpenAL来播放游戏音乐。它工作得很好,只是除了原始的WAV文件之外,它不适用于任何东西。这意味着我最终会有一张9MB的音轨。

我是OpenAL新手,我直接使用苹果示例(9)中的代码来获取缓冲区数据。

问:是否有任何方法来修改这个功能,让它读取压缩音频并对其进行动态解码?

我不太担心音频文件格式,只要它可以播放和压缩(如mp3,aac,caf)。我想这么做的唯一原因(很明显)是为了减少文件大小。

编辑:,与其说问题在OpenAL中,不如说是我用来获取缓冲区的方法。9的函数使用AudioFileOpenURLAudioFileReadBytes。有没有办法让框架用ExtAudioFileOpenURLExtAudioFileRead为我解码音频?

我试过这里的代码:https://devforums.apple.com/message/10678#10678,但我不知道该怎么做。我用来获取缓冲区的函数位于9,而且我还没有对它进行真正的修改,所以这就是我需要构建的。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-13 19:26:52

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-07-24 00:32:37

您不需要任何第三方库来打开归档文件。在AudioToolbox/AudioToolbox.h框架的帮助下,您可以打开和读取.caf文件的数据,这是一个非常好的选择(在性能方面优于mp3或ogg) (解压缩过程中对CPU的影响最小)。因此,当数据到达OpenAL时,它已经是PCM,可以填充缓冲区了。下面是一些关于如何实现这一目标的示例代码:

代码语言:javascript
复制
-(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;
}
票数 3
EN

Stack Overflow用户

发布于 2013-03-15 17:02:56

基于卡尔上面的答复,我做了一个最小的c++函数,它打开一个文件并返回一个pcm音频缓冲区(适合OpenAL )和创建OpenAL声音所需的所有信息(格式、样本、缓冲区大小等)。

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

希望能帮上忙!西奥

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6673051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档