m4a音频文件无法在iOS 9上播放

时间:2015-09-30 06:59:05

标签: core-audio ios9 audiounit m4a

我有一个音频相关应用,它有多声道混音器,可以一次播放m4a文件。 我使用AudioToolBox框架来传输音频,但是在iOS9上,框架在混合器渲染回调中引发了异常,我正在流式传输音频文件。

有趣的是,使用iOS9 SDK编译的应用程序继续在iOS7 / 8设备上完美地传输相同的文件,而不是iOS9。 现在我无法弄清楚Apple是否在iOS9中破坏了某些内容,或者我们的文件编码错误,但它们在iOS 7/8上都可以正常播放,但不是9。

例外:

malloc: *** error for object 0x7fac74056e08: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

它适用于所有其他格式不会产生任何异常或任何类型的内存错误,但不适用于m4a格式,这是非常令人惊讶的。

这是一个加载文件的代码,适用于wav,aif等格式但不适用于m4a:

- (void)loadFiles{

    AVAudioFormat *clientFormat = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32
                                                                   sampleRate:kGraphSampleRate
                                                                     channels:1
                                                                  interleaved:NO];
    for (int i = 0; i < numFiles && i < maxBufs; i++)  {

        ExtAudioFileRef xafref = 0;

        // open one of the two source files
        OSStatus result = ExtAudioFileOpenURL(sourceURL[i], &xafref);
        if (result || !xafref) {break; }

        // get the file data format, this represents the file's actual data format
        AudioStreamBasicDescription fileFormat;
        UInt32 propSize = sizeof(fileFormat);

        result = ExtAudioFileGetProperty(xafref, kExtAudioFileProperty_FileDataFormat, &propSize, &fileFormat);
        if (result) { break; }

        // set the client format - this is the format we want back from ExtAudioFile and corresponds to the format
        // we will be providing to the input callback of the mixer, therefore the data type must be the same

        double rateRatio = kGraphSampleRate / fileFormat.mSampleRate;

        propSize = sizeof(AudioStreamBasicDescription);
        result = ExtAudioFileSetProperty(xafref, kExtAudioFileProperty_ClientDataFormat, propSize, clientFormat.streamDescription);
        if (result) { break; }

        // get the file's length in sample frames
        UInt64 numFrames = 0;
        propSize = sizeof(numFrames);
        result = ExtAudioFileGetProperty(xafref, kExtAudioFileProperty_FileLengthFrames, &propSize, &numFrames);
        if (result) { break; }

        if(i==metronomeBusIndex)
            numFrames = (numFrames+6484)*4;
        //numFrames = (numFrames * rateRatio); // account for any sample rate conversion
        numFrames *= rateRatio;


        // set up our buffer
        mSoundBuffer[i].numFrames = (UInt32)numFrames;
        mSoundBuffer[i].asbd = *(clientFormat.streamDescription);

        UInt32 samples = (UInt32)numFrames * mSoundBuffer[i].asbd.mChannelsPerFrame;
        mSoundBuffer[i].data = (Float32 *)calloc(samples, sizeof(Float32));
        mSoundBuffer[i].sampleNum = 0;

        // set up a AudioBufferList to read data into
        AudioBufferList bufList;
        bufList.mNumberBuffers = 1;
        bufList.mBuffers[0].mNumberChannels = 1;
        bufList.mBuffers[0].mData = mSoundBuffer[i].data;
        bufList.mBuffers[0].mDataByteSize = samples * sizeof(Float32);

        // perform a synchronous sequential read of the audio data out of the file into our allocated data buffer
        UInt32 numPackets = (UInt32)numFrames;

        result = ExtAudioFileRead(xafref, &numPackets, &bufList);
        if (result) {
            free(mSoundBuffer[i].data);
            mSoundBuffer[i].data = 0;
        }

        // close the file and dispose the ExtAudioFileRef
        ExtAudioFileDispose(xafref);
    }

    // [clientFormat release];
}

如果有人能指出我正确的方向,我该如何调试问题? 我们是否需要以某种特定方式重新编码文件?

1 个答案:

答案 0 :(得分:0)

昨天我在iOS 9.1.beta3上尝试了它,事情似乎恢复正常。

试一试。如果它也适合您,请告诉我们。