7

OpenALを使用してiOSゲームで音楽を再生したい。音楽ファイルはmp3形式で保存されており、バッファキューを使用してストリーミングしたいと思います。AudioFileReadPacketData()を使用してオーディオデータをバッファにロードします。ただし、バッファを再生するとノイズが発生するだけです。cafファイルでは完全に機能しますが、mp3では機能しません。ファイルをデコードする際の重要なステップを見逃しましたか?

サウンドファイルを開くために使用するコード:

- (void) openFile:(NSString*)fileName {
   NSBundle *bundle = [NSBundle mainBundle];
   CFURLRef url = (CFURLRef)[[NSURL fileURLWithPath:[bundle pathForResource:fileName ofType:@"mp3"]] retain];
   AudioFileOpenURL(url, kAudioFileReadPermission, 0, &audioFile);
   AudioStreamBasicDescription theFormat;
   UInt32 formatSize = sizeof(theFormat);
   AudioFileGetProperty(audioFile, kAudioFilePropertyDataFormat, &formatSize, &theFormat);  
   freq = (ALsizei)theFormat.mSampleRate;
   CFRelease(url);
}

バッファを埋めるために使用するコード:

- (void) loadOneChunkIntoBuffer:(ALuint)buffer {
    char data[STREAM_BUFFER_SIZE];
    UInt32 loadSize = STREAM_BUFFER_SIZE;
    AudioStreamPacketDescription packetDesc[STREAM_PACKETS];
    UInt32 numPackets = STREAM_PACKETS;
    AudioFileReadPacketData(audioFile, NO, &loadSize, packetDesc, packetsLoaded, &numPackets, data);
    alBufferData(buffer, AL_FORMAT_STEREO16, data, loadSize, freq);
    packetsLoaded += numPackets;
}
4

1 に答える 1

1

MP3データのバイトを読み取り、それらをPCMデータとして扱っているためです。

あなたはほぼ間違いなく欲しいですAudioFileReadPacketData() 編集:それでもMP3データが得られることを除いて。それは単にそれをパケットで与え、(おそらく)パケットヘッダーを解析します。

OpenALが必要ない場合は、AVAudioPlayerがおそらくより良い方法です(マルチメディアプログラミングガイドによると、より詳細な制御が必要な場合は、オーディオキューサービスもあります)。

本当にOpenALを使用する必要がある場合は、TN2199に従って、ネイティブバイト順にPCMに変換する必要があります。拡張オーディオファイルサービスを使用してこれを行う例については、oalTouch / Classes/MyOpenALSupport.cを参照してください。TN2199は、フォーマットが「ハードウェア解凍を使用してはならない」と述べていることに注意してください。マルチメディアプログラミングガイドによると、OS 3.0以降、HE-AACを除くすべてでソフトウェアデコードがサポートされています。また、ソフトウェアMP3デコードはかなりのCPU時間を使用する可能性があることにも注意してください。

または、AudioConverterまたは(場合によっては)AudioUnitとkAudioUnitSubType_AUConverterを使用してオーディオを明示的に変換します。これを行う場合は、オーバーヘッドを最小限に抑えるために、すべてを一度解凍してメモリに保持することをお勧めします。

于 2010-07-19T18:46:01.903 に答える