- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近在Mac上使用AudioUnits设计了一个录音机。它的设计类似于视频安全系统,可以连续记录,并带有图形化的功率电平显示,以供回放浏览。
我注意到,每85分钟就会出现3分钟的失真。消除了一天之后,似乎在调用回调之前发生的声音获取使用了循环缓冲区,并且回调的audioUnitRender函数从该缓冲区中提取,但速度稍慢,最终导致内部缓冲区写回绕并被捕获与audioUnitRender读取有关。双工操作测试显示等待时间不断增加,在85分钟后,您听到了大约200-300ms的等待时间,并且噪声随着渲染缓冲区帧在缓冲区的开始和结尾具有缓冲区段的组合而开始,即长和短等待时间。当指针移开时,噪音消失,您会听到干净的音频,但延迟很短,然后在85分钟后再次重复。即使使用低影响的回调处理,这种情况仍然会发生。我看过一些有关延迟的帖子,但没有关于冲突的帖子,有人看过吗?
osx 10.9.5,xcode 6.1.1
代码详细信息:-
//modes 1=playback, 2=record, 3=both
AudioComponentDescription outputcd = {0}; // 10.6 version
outputcd.componentType = kAudioUnitType_Output;
outputcd.componentSubType = kAudioUnitSubType_HALOutput; //allows duplex
outputcd.componentManufacturer = kAudioUnitManufacturer_Apple;
AudioComponent comp = AudioComponentFindNext (NULL, &outputcd);
if (comp == NULL) {printf ("can't get output unit");exit (-1);}
CheckError (AudioComponentInstanceNew(comp, au),"Couldn't open component for outputUnit");
//tell input bus that its's input, tell output it's an output
if(mode==1 || mode==3) r=[self setAudioMode:*au :0];//play
if(mode==2 || mode==3) r=[self setAudioMode:*au :1];//rec
// register render callback
if(mode==1 || mode==3) [self setCallBack:*au :0];
if(mode==2 || mode==3) [self setCallBack:*au :1];
// if(mode==2 || mode==3) [self setAllocBuffer:*au];
// get default stream, change amt of channels
AudioStreamBasicDescription audioFormat;
UInt32 k=sizeof(audioFormat);
r= AudioUnitGetProperty(*au,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
1,
&audioFormat,
&k);
audioFormat.mChannelsPerFrame=1;
r= AudioUnitSetProperty(*au,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
1,
&audioFormat,
k);
//start
CheckError (AudioUnitInitialize(outputUnit),"Couldn't initialize output unit");
//record callback
OSStatus RecProc(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList * ioData)
{
myView * mv2=(__bridge myView*)inRefCon;
AudioBuffer buffer,buffer2;
OSStatus status;
buffer.mDataByteSize = inNumberFrames *4 ;// buffer size
buffer.mNumberChannels = 1; // one channel
buffer.mData =mv2->rdata;
buffer2.mDataByteSize = inNumberFrames *4 ;// buffer size
buffer2.mNumberChannels = 1; // one channel
buffer2.mData =mv2->rdata2;
AudioBufferList bufferList;
bufferList.mNumberBuffers = 2;
bufferList.mBuffers[0] = buffer;
bufferList.mBuffers[1] = buffer2;
status = AudioUnitRender(mv2->outputUnit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, &bufferList);
[mv2 recproc :mv->rdata :mv->rdata2 :inNumberFrames];
return noErr;
}
最佳答案
您似乎正在使用HAL输出单元来拉动输入。可能无法保证输入设备和输出设备的采样率完全锁定。任何一个设备的采样率的任何缓慢的轻微漂移最终都可能导致缓冲区下溢或溢出。
一种解决方案可能是为单独的输入音频单元查找和设置输入设备,而不是依赖于默认输出单元。尝试使用USB麦克风。
关于audio - AudioUnit(Mac)AudioUnitRender内部缓冲区冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35401872/
最近在看aurioTouch。但是我看不懂这句话: OSStatus err = AudioUnitRender (THIS-> rioUnit, ioActionFlags, inTimeStamp
我遇到了另一个 iOS 模拟器错误。我的问题是,是否有一些解决方法? 错误是这样的: 加载苹果的 AurioTouch 示例项目。 并简单地打印出渲染回调(在aurioTouchAppDelegate
当耳机插入 iOS 设备时,我想直接向扬声器播放录制的音频。 我所做的是在 AURenderCallback 函数中调用 AudioUnitRender,以便将音频数据写入 AudioBuffer 结
我有一个音乐制作应用程序,它使用 AUSampler 和 AURemoteIO 单元来播放用户定义的音符。我遇到一个问题,在使用一段时间后,对采样器上的 AudioUnitRender 的调用永远不会
我有一个配置了 AVAudioSessionCategoryPlayAndRecord 的 RemoteIO 单元。我发现其中有一些奇怪的行为。我打开应用程序,并在 audioUnit 完全初始化之前
我在 AudioUnitRender 调用中收到错误 -50。我的音频单元只是一个从麦克风获取样本的 RemoteIO 单元。错误-50是什么意思? let status = AudioUnitR
我正在从事一个项目,我在其中使用了 AudioUnitRender,它在模拟器中运行良好,但在设备中出现 -50 错误。 如果有人遇到过类似的问题,请给我一些解决方案。 RIOInterface* T
我遇到了一个问题,导致我无法从设备(iPhone4)上的麦克风捕获输入信号。但是,代码在模拟器中运行良好。该代码最初采用 Apple 的 MixerHostAudio 类(来自 MixerHost 示
我正在尝试使用 AudioUnit Render 进行离线渲染,但我没有看到哪个参数有误。可能是缓冲的大小。 我正在使用 swift 和 core audio 来解决这个问题,这是我从 Generic
在以下上下文中,我从 AudioUnitRender 收到错误 -50(无效参数)。我正在使用这个 Pitch Detector示例应用程序作为我的起点,它工作正常。我的项目中唯一的主要区别是我还使用
我一直在开发 iOS 频率检测应用程序,但在使用麦克风的音频样本填充用户定义的 AudioBufferList 时遇到问题。 当我在 InputCallback 方法中调用 AudioUnitRend
我们正在使用 AudioUnits 输入回调来处理传入缓冲区。音频单元设置主要取自 https://github.com/robovm/apple-ios-samples/blob/master/au
我正在尝试在 Swift 中将 MIDI 文件转换为音频文件 (.m4a)。 现在我正在使用 MIKMIDI作为排序和播放 MIDI 文件的工具,但是它不包括将播放保存到文件中的功能。 MIKMID
我是一名优秀的程序员,十分优秀!