AudioToolbox / OpenAL ExtAudioFile для воспроизведения сжатого аудио - PullRequest
4 голосов
/ 13 июля 2011

В настоящее время я использую OpenAL для воспроизведения игровой музыки.Он работает нормально, за исключением того, что он не работает ни с чем, кроме необработанных файлов WAV.Это означает, что я получаю саундтрек ~ 9 МБ.

Я новичок в 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 и AudioFileReadBytes. Есть ли способ получить основу для декодирования аудио для меня, используя 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, и я на самом деле не изменил его, так что это то, что мне нужно построить.

Я получил награду bпотому что мне это действительно нужно, надеюсь, кто-то может направить меня в правильном направлении.

Ответы [ 5 ]

4 голосов
/ 13 июля 2011

Вам нужно будет использовать аудио сервисы для загрузки других форматов. Помните, что OpenAL ONLY поддерживает несжатые данные PCM, поэтому любые загружаемые вами данные должны быть распакованы во время загрузки.

Вот код, который будет загружать любой формат, поддерживаемый iOS: https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/Support/OALAudioFile.m

Если вы хотите передавать сжатый звук типа саундтрека, используйте AVAudioPlayer, поскольку он воспроизводит сжатый звук прямо с диска.

3 голосов
/ 24 июля 2011

Вам не нужна сторонняя библиотека для открытия архивных файлов. С небольшой помощью фреймворка AudioToolbox/AudioToolbox.h вы можете открывать и читать данные файла .caf, который, кстати, является очень хорошим выбором (лучше, чем 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 голос
/ 15 марта 2013

Основываясь на ответе Карла выше, я сделал минимальную единственную функцию c ++, которая открывает файл и возвращает вам буфер аудиосигнала pcm (подходит для OpenAL) и всю информацию, необходимую для создания звука OpenAL (формат, частота дискретизации, размер буфера и т. д.).

два файла, которые вам нужны, находятся здесь: https://gist.github.com/ofTheo/5171369

надеюсь, это поможет! теор

0 голосов
/ 24 июля 2011

Вы можете попробовать использовать стороннюю библиотеку для загрузки mp3-ogg в буфер char *, и затем передаст этот буфер openAL. Это решило бы проблему размера файла.

Для ogg вы должны найти библиотеки на их сайте

Что касается mp3, я, честно говоря, не знаю, где найти легковесную библиотеку, которая могла бы сделать это. Но это должно существовать.

0 голосов
/ 17 июля 2011

Попробуйте, если это работает: http://kcat.strangesoft.net/openal-tutorial.html

...