gpt4 book ai didi

objective-c - 更改传递给 OpenAL 的音频数据的字节顺序

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:15 27 4
gpt4 key购买 nike

我在我正在开发的 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;是我需要反转的(当然是在将音频文件数据加载到其中之后),但我不知道该怎么做。有人可以帮我解决这个问题吗?

最佳答案

在这种情况下,您应该在配置ExtAudioFileAudioConvertor 格式后使用ExtAudioFileRead。它会为你节省很多时间。如果您知道所有输入文件都具有相同的样本格式,您可能会自行交换。

ExtAudioFile 位于 OS X 和 iOS 上的 AudioToolbox.framework 中(基本上是 AudioFile 之上的一层,具有更高级别的功能),您可以通过包装一个 AudioFile.

AudioConvertor 也可以在没有 ExtAudioFile 的情况下使用。

在某些情况下,您可以只使用 OS X afonvert 实用程序将它们交换为 LE,并且在不添加(不必要的)编程挑战的情况下完成它。

为数组编写您自己的端序交换例程并不难 - 只是耗时、乏味,而且您通常需要确保它快速并且能够支持不自然对齐的样本数据。这涉及:

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

W'rkncacnter 提供了这个链接:Convert big endian to little endian when reading from a binary file

如果自然对齐,您可以使用该方法。并且您将需要在输入中看到的每种尺寸和样本描述的变体。操作系统还提供 OSSwap 例程,但这些例程并不处理所有样本格式——它们专注于内置类型。

关于objective-c - 更改传递给 OpenAL 的音频数据的字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11960042/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com