首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IOS8.1调用AudioConvertFillComplexBuffer进行无限循环,cpuload为100%

IOS8.1调用AudioConvertFillComplexBuffer进行无限循环,cpuload为100%
EN

Stack Overflow用户
提问于 2015-02-13 00:01:29
回答 1查看 125关注 0票数 0

我正在使用AudioToolBox.AudioConverter库转换音频。

代码语言:javascript
复制
AudioStreamBasicDescription inDescription;
inDescription.mSampleRate = 44100;
inDescription.mFormatID = kAudioFormatMPEGLayer3;
inDescription.mFormatFlags = 0;
inDescription.mBytesPerPacket = 0;
inDescription.mFramesPerPacket = 1152;
inDescription.mBytesPerFrame = 0;
inDescription.mChannelsPerFrame = 2;
inDescription.mBitsPerChannel = 0;
inDescription.mReserved = 0;

AudioStreamBasicDescription outDescription;
audioDescription.mFormatID = kAudioFormatLinearPCM
audioDescription.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked | kAudioFormatFlagsNativeEndian;
audioDescription.mChannelsPerFrame = 2;
audioDescription.mBytesPerPacket = sizeof(SInt16)*audioDescription.mChannelsPerFrame;
audioDescription.mFramesPerPacket = 1;
audioDescription.mBytesPerFrame = sizeof(SInt16)*audioDescription.mChannelsPerFrame;
audioDescription.mBitsPerChannel = 8 * sizeof(SInt16);
audioDescription.mSampleRate = 44100.0;

这是mp3AudioData的转换部分...

代码语言:javascript
复制
AudioBufferList *mp3Audio = (AudioBufferList *)malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer));

mp3Audio->mNumberBuffers = 1;
mp3Audio->mBuffers[0].mNumberChannels  = 2;
mp3Audio->mBuffers[0].mDataByteSize = chunkLen;
mp3Audio->mBuffers[0].mData = calloc(chunkLen, sizeof(uint8_t));
memcpy(mp3Audio->mBuffers[0].mData, chunkData, chunkLen);

AudioStreamPacketDescription *packetDescription =
(AudioStreamPacketDescription*)malloc(sizeof(AudioStreamPacketDescription) * frames);
packetDescription->mDataByteSize = chunkLen;
packetDescription->mStartOffset = 0;
packetDescription->mVariableFramesInPacket = 1;

OSStatus result = AudioConverterFillComplexBuffer(audioConverter,
                                                  fillComplexBufferInputProc,
                                                  &(struct fillComplexBufferInputProc_t) { .bufferList =mp3Audio, .frames = frames, .packetDescriptions = packetDescription },
                                                  &frames,
                                                  pcmAudio,
                                                  NULL);

free(mp3Audio->mBuffers[0].mData);
free(mp3Audio);
free(packetDescription);

第一次运行AudioConverterFillComplexBuffer是正常的,但是当我第二次运行该函数时,无限循环发生了,cpuload 100%。

这段代码在iOS7设备上运行正常,但是当我在iOS8设备上运行它时,无限循环发生了。

谁能告诉我为什么在IOS 8上会发生这种情况?

fillComplexBufferInputProc函数:

代码语言:javascript
复制
static OSStatus fillComplexBufferInputProc(AudioConverterRef             inAudioConverter,
                                           UInt32                        *ioNumberDataPackets,
                                           AudioBufferList               *ioData,
                                           AudioStreamPacketDescription  **outDataPacketDescription,
                                           void                          *inUserData) {
    struct fillComplexBufferInputProc_t *arg = inUserData;

    for (int i = 0; i < ioData->mNumberBuffers; i++) {
        ioData->mBuffers[i].mData = arg->bufferList->mBuffers[i].mData;
        ioData->mBuffers[i].mDataByteSize = arg->bufferList->mBuffers[i].mDataByteSize;
    }

    if (NULL == *outDataPacketDescription) {
        *outDataPacketDescription = arg->packetDescriptions;
    }

    *ioNumberDataPackets = arg->frames;

    return noErr;
}
EN

回答 1

Stack Overflow用户

发布于 2015-05-28 17:36:36

因为在你的代码中似乎没有无限循环(除了fillComplexBufferInputProc函数中的- loop ),我建议你使用Instruments (Time Profiler)来看看是什么方法占用了大部分的CPU时间。查看堆栈跟踪以获取更多信息,也许我们可以提供帮助。Here是time profiler的教程。

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

https://stackoverflow.com/questions/28482074

复制
相关文章

相似问题

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