4

現在、OpenAL を使用してゲーム音楽を再生しています。生の WAV ファイル以外では動作しないことを除けば、正常に動作します。これは、最終的に 9 MB のサウンドトラックになることを意味します。

私は 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ます。ExtAudioFileOpenURLandを使用してオーディオをデコードするフレームワークを取得する方法はあります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

上記のカールの返信に基づいて、ファイルを開き、pcm オーディオのバッファー ( OpenAL に適しています) と、OpenAL サウンドを作成するために必要なすべての情報 (フォーマット、サンプルレート、バッファーサイズなど) を返す最小限の単一の C++ 関数を作成しました。 .

必要な 2 つのファイルはこちら: https://gist.github.com/ofTheo/5171369

それが役に立てば幸い!テオ

于 2013-03-15T17:02:56.183 に答える
0

サードパーティのライブラリを使用して mp3-ogg を char* バッファーにロードし、このバッファーを openAL に渡そうとするかもしれません。これにより、ファイルサイズの問題が解決されます。

ogg の場合、 Web サイトでライブラリを見つける必要があります。

mp3 の場合、それを実行できる軽量のライブラリがどこにあるのか正直わかりません。しかし、それは存在するはずです。

于 2011-07-23T22:54:59.000 に答える