停止AUGraph的口吃

时间:2014-02-16 06:58:11

标签: ios objective-c cocoa audio core-audio

当我第一次启动AUGraph并播放带有kAudioUnitSubType_AudioFilePlayer组件的歌曲时,我收到了一个断断续续的声音。口吃约3秒,但它足以打扰我加上我注意到音乐在播放时有时会停止一瞬间(我猜缓冲?)。我已尝试将kAudioUnitProperty_ScheduledFilePrime更改为随机值,但请注意不要更改。

我应该改变哪些变量或值来摆脱这个缺陷?这是流格式的问题吗?

我正在使用https://github.com/ronaldmannak/YBAudioFramework/tree/master/YBAudioUnit

中的YBAudioUnit

代码:

YBAudioFilePlayer:

- (void)setFileURL:(NSURL *)fileURL typeHint:(AudioFileTypeID)typeHint {
    if (_fileURL) {
        // Release old file:
        AudioFileClose(_audioFileID);
    }

    _fileURL = fileURL;

    if (_fileURL) {
        YBAudioThrowIfErr(AudioFileOpenURL((__bridge CFURLRef)fileURL, kAudioFileReadPermission, typeHint, &_audioFileID));
        YBAudioThrowIfErr(AudioUnitSetProperty(_auAudioUnit, kAudioUnitProperty_ScheduledFileIDs, kAudioUnitScope_Global, 0, &_audioFileID, sizeof(AudioFileID)));

        // Get number of audio packets in the file:
        UInt32 propsize = sizeof(_filePacketsCount);
        YBAudioThrowIfErr(AudioFileGetProperty(_audioFileID, kAudioFilePropertyAudioDataPacketCount, &propsize, &_filePacketsCount));

        // Get file's asbd:
        propsize = sizeof(_fileASBD);
        YBAudioThrowIfErr(AudioFileGetProperty(_audioFileID, kAudioFilePropertyDataFormat, &propsize, &_fileASBD));

        // Get unit's asbd:
        propsize = sizeof(_fileASBD);
        AudioUnitGetProperty(_auAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &_unitASBD, &propsize);

        if (_fileASBD.mSampleRate > 0 && _unitASBD.mSampleRate > 0) {
            _sampleRateRatio = _unitASBD.mSampleRate / _fileASBD.mSampleRate;
        } else {
            _sampleRateRatio = 1.;
        }
    }
}

要玩,我在YBAudioFilePlayer上调用这些方法:

[player1 setFileURL:item.url typeHint:0];
[player1 scheduleEntireFilePrimeAndStartImmediately];
[graph start];//On a YBAudioUnitGraph which is really just a basic AUGraph

2 个答案:

答案 0 :(得分:0)

这不仅是一个答案,这是一个评论,但它相当大,所以我会在这里发布。

我没有时间和耐心去研究YB .. API中的代码。但是我想到了几个问题。

首先我记得尝试使用音频单元(使用Apple的API)并且我有很多口吃。我解决了在回调中删除所有Objective-C调用的问题,这些调用将数据提供给我的AUGraph(好吧,除了一个我无法删除的内容之外,我删除了所有内容)。我用纯C和C ++调用替换了所有Objective-c调用。例如:

... this is the render callback
int i = [myClass someProperty];  // obj-c
int i = myClass->someVarialbe;  // c, c++

这只是一个例子,但它得到了极大的改善,我摆脱了口吃。也许您可以看一下YBXX API的实现,看看回调中是否有很多obj-c调用,如果有,我就不会使用API​​。

第二次观察。看起来你只是想播放一个音频文件,因为AudioGraph的开销很大,你可以使用没有Graph的单个IO音频单元。

答案 1 :(得分:0)

有很多问题要问:

首先,您使用的是压缩音频文件吗?如果是这样,您可能需要考虑填充帧(kAudioFilePropertyPacketTableInfo)以获取文件中的实际音频帧数。也许尝试AIFF,CAF或WAV文件。

您确定没有其他音频应用在后台运行吗?

是否有任何记录消息?

您是否尝试过发布到github上的问题页面?

最后一个问题是你为什么要使用他们的框架(两年内没有更新)。我建议The Amazing Audio Engine。它是由iOS上一些最好的音频人员积极开发的。

相关问题