我在语音聊天应用程序中使用RemoteIO.为了启用回声消除,在将"kAudioSessionCategory_PlayAndRecord"设置为会话类型后,我将"kAudioUnitSubType_RemoteIO"更改为"kAudioUnitSubType_VoiceProcessingIO".现在回声消除工作,但输出音量水平相对于之前的RemoteIO输出水平显着下降.有没有人知道如何在使用VoiceProcessingIO时获得与使用RemoteIO时相同的输出音量?
RemoteIO设备有没有办法在iPhone 5上拿回麦克风?我可以配置AVAudioSession
在前置麦克风或底部麦克风之间进行选择,但我找不到选择后置麦克风的方法.
在AVFoundation framework
确定了使用视频录制的背部麦克风使用后置摄像头的时候,但我希望的方式来选择使用相同的CoreAudio的.那可能吗 ?
在我的应用程序中,我需要在这两个不同的AudioUnit之间切换.每当我从VPIO切换到RemoteIO时,我的录音音量就会下降.相当大幅下降.尽管播放音量没有变化.有人经历过这个吗?
这是我进行切换的代码,由路由更改触发.(我不太确定我是否正确改变了,所以我也在这里问.)
如何解决录音音量下降的问题?
谢谢,感谢我能得到的任何帮助.
码头.
- (void)switchInputBoxTo : (OSType) inputBoxSubType
{
OSStatus result;
if (!remoteIONode) return; // NULL check
// Get info about current output node
AudioComponentDescription outputACD;
AudioUnit currentOutputUnit;
AUGraphNodeInfo(theGraph, remoteIONode, &outputACD, ¤tOutputUnit);
if (outputACD.componentSubType != inputBoxSubType)
{
AUGraphStop(theGraph);
AUGraphUninitialize(theGraph);
result = AUGraphDisconnectNodeInput(theGraph, remoteIONode, 0);
NSCAssert (result == noErr, @"Unable to disconnect the nodes in the audio processing graph. Error code: %d '%.4s'", (int) result, (const char *)&result);
AUGraphRemoveNode(theGraph, remoteIONode);
// Re-init as other type
outputACD.componentSubType = inputBoxSubType;
// …
Run Code Online (Sandbox Code Playgroud) 我的音频分析功能在iPad(2)上比iPhone(4)响应更好.它似乎对iPad上较柔和的声音很敏感,而iPhone需要更响亮的输入才能正确响应.无论这是因为麦克风放置,不同的组件,不同的软件配置或其他因素,我希望能够在我的应用程序中控制它.
显然,我可以将所有音频样本相乘以编程方式应用增益.当然那也有软件成本,所以:
是否可以通过iOS中的软件控制麦克风的增益,与MacOS中的相似?我找不到任何关于此的文档,但我希望我能以某种方式错过它.
我使用基于Matt Gallagher 经典示例的 AudioUnits在iPhone上生成音调.为了避免开始/结束时的唧唧声和咔嗒声,我在回调中淡入/淡出幅度RenderTone
.我希望在淡出结束时摧毁ToneUnit,也就是说,在振幅达到零之后.我能想到的唯一方法就是从回调中调用实例方法:
if (PlayerState == FADING_OUT) {
amplitude -= stepsize;
if (amplitude <= 0) {
amplitude = 0;
PlayerState = OFF;
[viewController destroyToneUnit];
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这比我想象的更具挑战性.首先,我仍然得到了fadeout应该消除的最后点击.另一方面,我收到此日志通知:
<AURemoteIO::IOThread> Someone is deleting an AudioConverter while it is in use.
Run Code Online (Sandbox Code Playgroud)
这条消息意味着什么,为什么我得到它?
如何应我杀ToneUnit?我怀疑发生了点击,因为RenderTone
它destroyToneUnit
在不同的线程上运行.如何让这些同步?
如果它有用,这是我的destroyToneUnit
实例方法:
- (void) destroyToneUnit {
AudioOutputUnitStop(toneUnit);
AudioUnitUninitialize(toneUnit);
AudioComponentInstanceDispose(toneUnit);
toneUnit = nil;
}
Run Code Online (Sandbox Code Playgroud)
如果我在之前和之后的NSLog消息AudioUnitUninitialize(toneUnit);
,通知出现在它们之间.
我们正在开发一个需要在 iOS 中更改音频路由的应用程序。我们需要从麦克风输入中获取一些信息,然后切换到设备的内部麦克风来录制环境声音。
我们已经从这些页面看到了 2 个主题:强制 iPhone 麦克风作为音频输入和如果耳机已插入则使用内置麦克风,但我想根据这种情况没有任何最终决定。
现在,代码可以工作了,但我们可以选择音频输入的路径。
我们在 Apple (Remote IO) 提供的文档中没有找到任何内容。
这有什么新的吗?
谢谢!
我有一个非常简单的 iOS Core Audio 应用程序,其结构如下:
Remote I/O Unit Input Bus --> Render Callback --> Remote I/O Unit Output Bus
由远程 I/O 输出总线调用的渲染回调函数通过调用AudioUnitRender()
远程 I/O 输入总线从输入硬件中提取样本。然后它处理/影响这些样本,写入提供的样本AudioBufferList*
并返回,导致通过输出硬件播放受影响的样本。一切正常。
我的问题是我如何知道或计算出以下的准确时间:
一个AudioTimeStamp
结构体被传递到渲染回调中,并带有有效的mHostTime
, mSampleTime
&mRateScalar
值。我不清楚这个时间戳到底反映了什么。该文件指出:
inTimeStamp 与此音频单元渲染调用关联的时间戳。
这听起来像它所代表的渲染被调用时,却怎么也该关联(如果有的话),以在其中输入样本的时间进行拍摄和输出样本将被呈现?
一些在线资源谈到使用mach_absolute_time()
或CACurrentMediaTime()
计算当前主机时间,但是我似乎无法再次建立从当前主机时间到过去或未来主机时间的连接。
以下引用来自 Apple 邮件列表线程的三个时间戳,包括用于过去输入数据和未来输出数据的单独时间戳。这正是我正在寻找的,但是我相信这是在 OS X 上运行并使用 AUHAL I/O。我找不到在 iOS 上检索这些时间戳的方法。
因此,CoreAudio 的工作方式是 I/O proc 触发并为您提供 3 个时间戳:(1) 是输入数据的时间戳 - 如果有的话。这将始终至少是过去的缓冲区大小 (2) 是现在的时间戳 - 当 …
我在 iOS 16 中收到错误。此错误不会出现在以前的 iOS 版本中。我正在使用 RemoteIO 以 4000 Hz 播放实时音频。错误如下:
输入数据过程返回不一致的2个186字节数据包;每个数据包 2 字节,实际上是 93 个数据包
这是音频格式和回调的设置方式:
// Set the Audio format
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 4000;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 2;
audioFormat.mBytesPerFrame = 2;
AURenderCallbackStruct callbackStruct;
// Set output callback
callbackStruct.inputProc = playbackCallback;
callbackStruct.inputProcRefCon = (__bridge void * _Nullable)(self);
status = AudioUnitSetProperty(audioUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Global,
kOutputBus,
&callbackStruct,
sizeof(callbackStruct));
Run Code Online (Sandbox Code Playgroud)
请注意,我设置的 mSampleRate 为 4000 Hz。在 iOS 15 …
remoteio ×8
core-audio ×6
ios ×6
audiounit ×3
iphone ×2
audio ×1
avfoundation ×1
ios16 ×1
microphone ×1
routes ×1