gpt4 book ai didi

objective-c - ExtAudioFileRead 在 iOS 5 中给出不同的结果

转载 作者:可可西里 更新时间:2023-11-01 04:54:43 25 4
gpt4 key购买 nike

我正在尝试从 MP3 文件中提取线性 PCM 数据。在 iOS 5 之前,我可以使用 AudioToolbox 框架成功完成此操作,特别是 ExtAudioFileRead 函数。但是,在 iOS 5 中,ExtAudioFileRead 函数给出的结果与 iOS 4 中的结果完全不同。

首先,它无法读取源 MP3 文件中的所有数据包。例如,它只读取了1637个数据包,而源MP3文件总共有2212个数据包。

其次,该函数得到的PCM值与iOS 4完全不同。

我不知道我做错了什么:(同样的框架,同样的功能,同样的代码……结果却截然不同?我怀疑这是 iOS 5 的错误,所以我已经向 Apple 报告了这个问题。但是 Apple 已经 2 周没有回复我的错误报告了!

这是导致问题的代码。执行代码后,我希望在 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);

最佳答案

哎呀。我注意到如果歌曲的原始采样率不同,数字也会不同。回到方 block 1。

关于objective-c - ExtAudioFileRead 在 iOS 5 中给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8078060/

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