我试图从MP3文件中提取线性PCM数据。在iOS 5之前,我可以使用AudioToolbox框架,特别是ExtAudioFileRead函数成功地完成它。然而,在iOS 5中的函数给出的结果与iOS 4.中的结果完全不同。
首先,它不能读取源MP3文件中的所有数据包,例如,它只读取1637个数据包,而源MP3文件总共有2212个数据包。
第二,由该函数得到的PCM值与iOS 4.中的值完全不同。
我不知道我做错了什么:(相同的框架,相同的函数,同样的代码.但结果完全不同?我怀疑这是iOS 5的错误,所以我已经向苹果报告了这个问题。但是苹果已经两周没有回应我的错误报告了!
这是导致问题的代码。在执行代码之后,我希望在pcmBuffer中有正确的PCM数据。在iOS 4中,代码给出了我预期的结果。但在iOS 5中,结果完全不同,而且是错误的。
拜托,谁来帮帮我!
OSStatus status;
ExtAudioFileRef fileRef;
CFURLRef fileURL = (CFURLRef)[NSURL fileURLWithPath:filePath];
status = ExtAudioFileOpenURL((CFURLRef)fileURL, &fileRef);
AudioStreamBasicDescription dataFormat;
dataFormat.mSampleRate = SAMPLE_RATE;
dataFormat.mFormatID = kAudioFormatLinearPCM;
dataFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
dataFormat.mFramesPerPacket = 1;
dataFormat.mChannelsPerFrame = 1;
dataFormat.mBitsPerChannel = 16;
dataFormat.mBytesPerPacket = 2;
dataFormat.mBytesPerFrame = 2;
UInt32 propDataSize;
AudioStreamBasicDescription originalDataFormat;
propDataSize = (UInt32)sizeof(originalDataFormat);
status = ExtAudioFileGetProperty(fileRef, kExtAudioFileProperty_FileDataFormat, &propDataSize, &originalDataFormat);
SInt64 numPackets;
propDataSize = sizeof(numPackets);
status = ExtAudioFileGetProperty(fileRef, kExtAudioFileProperty_FileLengthFrames, &propDataSize, &numPackets);
propDataSize = (UInt32)sizeof(dataFormat);
status = ExtAudioFileSetProperty(fileRef, kExtAudioFileProperty_ClientDataFormat, propDataSize, &dataFormat);
numPackets = (SInt64)numPackets / (SInt64)(originalDataFormat.mSampleRate / SAMPLE_RATE);
size_t bufferSize = (size_t)(numPackets * sizeof(SInt16));
SInt16 *pcmBuffer = (SInt16 *)malloc(bufferSize);
AudioBufferList bufList;
bufList.mNumberBuffers = 1;
bufList.mBuffers[0].mNumberChannels = 1;
bufList.mBuffers[0].mDataByteSize = bufferSize;
bufList.mBuffers[0].mData = pcmBuffer;
ExtAudioFileSeek(fileRef, 0);
UInt32 totalFramesRead = 0;
do {
UInt32 framesRead = numPackets - totalFramesRead;
bufList.mBuffers[0].mData = pcmBuffer + (totalFramesRead * (sizeof(SInt16)));
ExtAudioFileRead(fileRef, &framesRead, &bufList);
totalFramesRead += framesRead;
if(framesRead == 0) {
break;
}
NSLog(@"read %lu frames\n", framesRead);
} while (totalFramesRead < numPackets);
int totalPackets = totalFramesRead;
status = ExtAudioFileDispose(fileRef);
NSLog(@"numPackets : %lld, totalPackets : %d", numPackets, totalPackets);发布于 2013-02-15 02:26:20
唉哟。我注意到,如果歌曲的原始采样率不同的话,数字是不一样的。回到1号广场。
https://stackoverflow.com/questions/8078060
复制相似问题