- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我第一次启动 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
最佳答案
这不仅仅是一个答案,这是一个评论,但它相当大,所以我会在这里发布。
我没有时间和耐心研究YB.. API里面的代码。但是我想到了一些事情。
我记得首先尝试使用 Audio Units(使用 Apple 的 API)并且我遇到了很多口吃。我解决了这个问题,删除了将数据提供给我的 AUGraph 的回调中的所有 objective-C 调用(好吧,除了我无法删除的一个,我删除了所有调用)。我用纯 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 音频单元。
关于ios - 停止 AUGraph 的卡顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21808286/
我有一个卡片列表: hand = ["KC", "QC", "4C", "0S"] 而且我总是想获得排名最高的卡片,就像在这个列表中一样 rank_cards = ["2", "3",
我正在使用 Opencv 2.4.3,我的显卡是 ATI,但我一直在阅读 CUDA 启用了 Nvidia,这是否意味着只要我有 ATI 显卡我就不能使用 gpu 功能? 最佳答案 的确,CUDA 技术
在 Android 中实现 Stripe 时,有一个 CardInputWidget 给你一个 Card 对象,然后你得到一个token 来自 Stripe API 使用该卡,最后您将该 token
我是一名优秀的程序员,十分优秀!