当我第一次启动AUGraph并播放带有kAudioUnitSubType_AudioFilePlayer组件的歌曲时,我收到了口吃的声音。口吃大约是3秒,但它足以困扰我,而且我注意到,有时音乐会在播放时瞬间停止(我想要缓冲?)我尝试过将kAudioUnitProperty_ScheduledFilePrime更改为随机值,但没有注意到任何更改。
为了消除这个缺陷,我应该改变哪些变量或值?这是流格式的问题吗?
我正在使用来自https://github.com/ronaldmannak/YBAudioFramework/tree/master/YBAudioUnit的https://github.com/ronaldmannak/YBAudioFramework/tree/master/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发布于 2014-02-22 16:54:56
这不仅仅是一个评论,但它相当大,所以我会在这里发布它。
我没有时间和耐心去研究YB内部的代码。API接口。但我脑子里想了几句。
首先,我记得我尝试过音频单元(使用苹果的API),我有很多口吃。我解决了在回调中删除所有目标-C调用的问题,该回调将数据提供给我的AUGraph (嗯,我删除了除一个无法摆脱的调用之外的所有调用)。我用纯C和C++调用替换了所有的Objective调用。示例:
... this is the render callback
int i = [myClass someProperty]; // obj-c
int i = myClass->someVarialbe; // c, c++这只是一个例子,但它有了很大的进步,我摆脱了口吃。也许您可以查看一下YBXX API的实现,看看回调中是否有很多obj-c调用,如果有,我将不使用该API。
第二次观察。看起来,您只想播放一个音频文件,对于这个文件来说,拥有一个AudioGraph是一种很大的开销,您可以使用一个没有图形的IO音频单元。
发布于 2014-03-13 14:12:59
有许多问题要问:
首先,您正在使用压缩音频文件吗?如果是这样的话,您可能需要考虑填充帧(kAudioFilePropertyPacketTableInfo)才能获得文件中音频帧的真实数量。可能会尝试一个AIFF、CAF或WAV文件。
你是否确保没有其他音频应用程序在后台运行?
是否有任何记录消息?
你试过在github上发布他们的问题页面吗?
最后一个问题是,您为什么要使用他们的框架(这个框架已经两年没有更新)。我推荐神奇的音频引擎。它是积极开发的一些最好的音频在iOS上的人。
https://stackoverflow.com/questions/21808286
复制相似问题