2

私が取り組んでいる iOS アプリで OpenAL を使用しています。クライアントから、すべてビッグエンディアン形式の多数のオーディオ ファイルが提供されました。私の問題は、OpenAL がリトル エンディアン形式しか再生できないことです。

それで、私がする必要があるのは、オーディオデータを見つけてそれを逆にすることだけだと思いますよね?

オーディオ データを抽出するための私のコード (OpenAL チュートリアルから取得):

-(void)addSound:(NSString*)theSound
{
// get the full path of the file
NSString* fileName = [[NSBundle mainBundle] pathForResource:theSound ofType:@"caf"];
// first, open the file
NSLog(@"fileNAme is ===== %@", fileName);
AudioFileID fileID = [self openAudioFile:fileName];

// find out how big the actual audio data is
UInt32 fileSize = [self audioFileSize:fileID];

// this is where the audio data will live for the moment
unsigned char * outData = malloc(fileSize);

// this where we actually get the bytes from the file and put them
// into the data buffer
OSStatus result = noErr;
result = AudioFileReadBytes(fileID, false, 0, &fileSize, outData);
NSLog(@"OUT DATA IS == %d", outData);
AudioFileClose(fileID); //close the file

if (result != 0) NSLog(@"cannot load effect: %@",fileName);

NSUInteger bufferID;
// grab a buffer ID from openAL
alGenBuffers(1, &bufferID);

// jam the audio data into the new buffer
alBufferData(bufferID,AL_FORMAT_STEREO16,outData,fileSize,44100);

// save the buffer so I can release it later
[bufferStorageArray addObject:[NSNumber numberWithUnsignedInteger:bufferID]];

NSUInteger sourceID;

// grab a source ID from openAL
alGenSources(1, &sourceID);

// attach the buffer to the source
alSourcei(sourceID, AL_BUFFER, bufferID);
// set some basic source prefs
alSourcef(sourceID, AL_PITCH, 1.0f);
alSourcef(sourceID, AL_GAIN, 1.0f);

//alSourcei(sourceID, AL_LOOPING, AL_TRUE);

// store this for future use
[soundDictionary setObject:[NSNumber numberWithUnsignedInt:sourceID] forKey:theSound];

// clean up the buffer
if (outData)
{
    free(outData);
    outData = NULL;
}
}

unsigned char * outdata; は逆にする必要があることを理解しています(もちろん、オーディオファイルデータがロードされた後)が、そうする方法がわかりません。誰でもこれで私を助けてくれますか?

4

1 に答える 1

1

この場合、 の の形式を構成した後に を使用する必要がありますExtAudioFileRead。時間を大幅に節約できます。すべての入力ファイルのサンプル形式が同じであることがわかっている場合は、自分自身を入れ替えることができます。ExtAudioFileAudioConvertor

ExtAudioFileOS X および iOS の AudioToolbox.framework (基本的には、AudioFileより高レベルの機能を備えた上のレイヤー) にあり、AudioFile.

AudioConvertorなしでも使用できExtAudioFileます。

場合によっては、OS Xafonvertユーティリティを使用してそれらを LE にスワップするだけで、(不必要な) プログラミングの課題を追加することなく、LE で完了することができます。

配列の独自のエンディアン スワップ ルーチンを作成することは難しくありません。単に時間がかかり、退屈であり、通常は高速で、不自然に整列されたサンプル データをサポートできることを確認する必要があります。これには以下が含まれます。

for (each sample) {
  reverse order of bytes in sample
}

W'rkncacnter はこのリンクを提供しました:バイナリ ファイルから読み取るときに、ビッグ エンディアンをリトル エンディアンに変換します。

自然に配置されている場合は、そのアプローチを使用できます。また、入力時に表示される各サイズとサンプルの説明のバリアントが必要になります。OS もOSSwapルーチンを提供しますが、これらはすべてのサンプル形式を処理するわけではなく、組み込み型に焦点を当てています。

于 2012-08-14T20:49:06.907 に答える