首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExtAudioFileRead在iOS 5中给出了不同的结果

ExtAudioFileRead在iOS 5中给出了不同的结果
EN

Stack Overflow用户
提问于 2011-11-10 10:26:42
回答 1查看 1.2K关注 0票数 5

我试图从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中,结果完全不同,而且是错误的。

拜托,谁来帮帮我!

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2013-02-15 02:26:20

唉哟。我注意到,如果歌曲的原始采样率不同的话,数字是不一样的。回到1号广场。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8078060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档