当我第一次启动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
答案 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上一些最好的音频人员积极开发的。