Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS上的MP3流媒体_Iphone_Openal - Fatal编程技术网

Iphone iOS上的MP3流媒体

Iphone iOS上的MP3流媒体,iphone,openal,Iphone,Openal,我想使用OpenAL在iOS游戏中播放音乐。音乐文件以mp3格式存储,我想使用缓冲队列对其进行流式传输。我使用AudioFileReadPacketData()将音频数据加载到缓冲区。然而,玩缓冲器只会给我带来噪音。它适用于caf文件,但不适用于MP3。我是否错过了解码文件的关键步骤 用于打开声音文件的代码: - (void) openFile:(NSString*)fileName { NSBundle *bundle = [NSBundle mainBundle]; CFURLR

我想使用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数据之外;它只是在数据包中给出它,并且(可能)解析数据包头

如果您不需要OpenAL,AVAudioPlayer可能是更好的方式(根据,如果您想要更多控制,还可以使用音频队列服务)

如果您真的需要使用OpenAL,根据需要,您需要以本机字节顺序将其转换为PCM。有关使用扩展音频文件服务执行此操作的示例,请参见。请注意,TN2199表示该格式“必须……不要使用硬件解压缩”-根据《多媒体编程指南》,自OS 3.0以来,除HE-AAC外,其他所有格式都支持软件解码。还请注意,软件MP3解码可能会占用大量CPU时间


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

谢谢您的回复。我将AudioFileReadBytes()替换为AudioFileReadPacketData()。我用新代码更新了问题。问题依然存在,我得到的只是噪音。出于兴趣,你决定用什么?我使用的是AVAudioPlayer,它非常适合我的需要。我还是不知道我怎么会错过它。再次感谢你的回答。