gpt4 book ai didi

iphone - iOS 上的 MP3 流媒体播放

转载 作者:行者123 更新时间:2023-12-03 18:40:19 26 4
gpt4 key购买 nike

我想使用 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;
}

最佳答案

因为您正在读取 MP3 数据字节并将它们视为 PCM 数据。

您几乎肯定需要 AudioFileReadPacketData() 编辑:除了仍然为您提供 MP3 数据;它只是在数据包中给出它并(可能)解析数据包 header 。

如果您不需要 OpenAL,AVAudioPlayer 可能是更好的选择(根据 Multimedia Programming Guide ,如果您想要更多控制,还有音频队列服务)。

如果确实需要使用OpenAL,按照TN2199您需要将其转换为 native 字节顺序的 PCM。请参阅oalTouch/Classes/MyOpenALSupport.c有关使用扩展音频文件服务来执行此操作的示例。请注意,TN2199 表示该格式“必须……不使用硬件解压缩”——根据多媒体编程指南,自 OS 3.0 起,除 HE-AAC 之外的所有内容都支持软件解码。另请注意,软件 MP3 解码可能会占用大量 CPU 时间。

或者,使用 AudioConverter 或(可能)带有 kAudioUnitSubType_AUConverter 的 AudioUnit 显式转换音频。如果您这样做,可能值得将所有内容解压缩一次并将其保留在内存中以最大限度地减少开销。

关于iphone - iOS 上的 MP3 流媒体播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3279647/

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