在Objective-C中,同时录制和播放音频非常简单.互联网上有大量的示例代码.但我想在Swift中使用Audio Unit/Core Audio同时录制和播放音频.使用Swift有很多帮助和示例代码.我找不到任何可以说明如何实现这一目标的帮助.
我正在努力与波纹管代码.
let preferredIOBufferDuration = 0.005
let kInputBus = AudioUnitElement(1)
let kOutputBus = AudioUnitElement(0)
init() {
// This is my Audio Unit settings code.
var status: OSStatus
do {
try AVAudioSession.sharedInstance().setPreferredIOBufferDuration(preferredIOBufferDuration)
} catch let error as NSError {
print(error)
}
var desc: AudioComponentDescription = AudioComponentDescription()
desc.componentType = kAudioUnitType_Output
desc.componentSubType = kAudioUnitSubType_VoiceProcessingIO
desc.componentFlags = 0
desc.componentFlagsMask = 0
desc.componentManufacturer = kAudioUnitManufacturer_Apple
let inputComponent: AudioComponent = AudioComponentFindNext(nil, &desc)
status = AudioComponentInstanceNew(inputComponent, &audioUnit)
checkStatus(status)
var flag = UInt32(1)
status = AudioUnitSetProperty(audioUnit, …Run Code Online (Sandbox Code Playgroud) 我正在使用此代码.
var audioUnit:AudioUnit = AudioUnit()
Run Code Online (Sandbox Code Playgroud)
但是在Xcode 7.3(Swift 2.2)中,我收到了这个警告.知道为什么吗?我怎么能摆脱它呢?
NB我使用nil然后我的程序崩溃了.
我对iOS编程完全不熟悉(我更像是一个Android人......)并且必须构建一个处理音频DSP的应用程序.(我知道这不是接近iOS开发的最简单方法;))
该应用程序需要能够接受以下输入:
1-内置麦克风2- iPod库
然后可以将滤波器应用于输入声音,并将结果输出到:
1-扬声器2-录制到文件
我的问题如下:为了能够将多个过滤器应用于输入,或者通过处理具有不同渲染回调的样本可以应用这些不同的效果,是否必须使用AUGraph?
如果我使用AUGraph,我需要:每个输入1个音频单元,输出1个音频单元和每个效果/滤波器1个音频输入吗?
最后,如果我不这样做,我可能只有1个音频单元并重新配置它以选择源/目的地?
非常感谢您的回答!我迷失了这些东西......
我正在努力实现一些看起来应该很简单的东西:在Mac应用程序中侦听MIDI消息,并使用它们来播放现有AVAudioUnit乐器的音符.
假设:我需要在与我的CoreMIDI客户端关联的MIDIReadBlock(通过MIDIInputPortCreateWithBlockMIDIClientRef)和我可以从我的AVAudioUnit的AUAudioUnit(via scheduleMIDIEventBlock)获得的AUScheduleMIDIEventBlock 之间建立一个桥梁.这似乎比它应该更复杂,因为我将使用原始MIDI数据 - 我觉得音频单元必须支持一些易于与CoreMIDI一起使用的MIDI抽象,但我找不到任何相关的例子这个的.也许有一种方法可以使用MIDIOutputPortCreateAV/AUAudioUnit?
我正在寻找的是一个将MIDI输入直接输入音频单元(理想情况下使用Swift 3)的工作示例,但如果您知道任何相对较新的相关资源,请分享这些链接.这些API的文档稀疏性非常令人沮丧.谢谢!
有谁知道如何用iOS制作一个简单的EQ音频单元(3个频段 - 低,中,高)?我知道如何在我的AU Graph中添加iPod EQ音频单元.但它只允许您访问预设,我需要适当控制EQ.
我四处寻找一些教程或解释,但没有运气.
谢谢.
安德烈
这实际上更像是一个理论问题,但在这里:
我正在开发一种效果音频单元,它需要在干信号和湿信号之间进行相等的功率交叉渐变.
但我对于从线性衰减器到干流和湿流信号幅度的比例因子(增益)的映射函数的正确方法感到困惑.
基本上,我看到它用cos/sin函数或平方根完成...基本上近似对数曲线.但是,如果我们对幅度的感知是开始时的对数,那么这些将推子位置映射到幅度的曲线实际上不应该是指数的吗?
这就是我的意思:
假设:
signal[i] 表示信号中的第i个样本.fader 是具有NSSlider值的变量.第一次观察:
我们以对数方式感知振幅.因此,如果我们有一个线性推子,只是通过这样做来调整信号的幅度:signal[i] * fader我们所感知的内容(听觉,无论数学如何)都是这样的:

这就是所谓的蹩脚的推子效应:我们从静音变为滑块中最左边一段的剧烈音量增加,经过中间音量似乎没有那么响亮.
因此,为了使推子"正确",我们要么以dB尺度表示,然后,就信号而言,做:signal[i] * 10^(fader/20)或者,如果我们要保持[0,1]或推子单位,我们可以做:signal[i] * (.001*10^(3*fader))
无论哪种方式,我们从NSSlider到我们将在代码中使用的推子变量的新映射现在看起来像这样:

这是我们真正想要的,因为由于我们以对数方式感知振幅,我们基本上从线性(NSSLider范围0-1)映射到指数,并将这个指数输出馈送到我们的对数感知.事实证明:log(10^x)=x所以我们最终以线性(也就是正确的)方式感知幅度变化.
大.
现在,我的想法是两个信号之间的等功率交叉淡化(在这种情况下是干/湿水平NSSlider将输入混合到AU和来自它的处理输出)基本上只相同,只有一个滑块作用于两个假设信号都干[i]和湿[i].
因此,如果我的滑块范围从0到100并且干完全左,而湿是完全右,我最终会得到以下代码:
Float32 outputSample, wetSample, drySample = <assume proper initialization>
Float32 mixLevel = .01 * GetParameter(kParameterTypeMixLevel);
Float32 wetPowerLevel = .001 * pow(10, (mixLevel*3));
Float32 dryPowerLevel = .001 * pow(10, ((-3*mixLevel)+1));
outputSample = (wetSample * wetPowerLevel) + (drySample * dryPowerLevel);
Run Code Online (Sandbox Code Playgroud)
其图表将是:

和以前一样,因为我们以对数方式感知振幅,这种指数映射实际上应该使我们听到交叉渐变是线性的.
但是,我已经看到使用近似值来记录交叉淡化的实现.意思是:

但这些曲线实际上不会强调我们对振幅的对数感知吗?
除了我控制的音频流之外,我正试图将所有音频的右声道静音.
我正在使用一些图书馆播放音频,包括用于文本到语音的OpenEars,我希望他们所有人只播放左耳机扬声器,而我在右扬声器播放其他内容.
我知道如何播放正确的扬声器创建音频单元流,但我不是为其他库创建音频流.有没有办法更改默认音频通道?或者是否可以创建一个努力或混音器,应用于所有音频输出,使正确的频道静音?
任何帮助/提示将不胜感激.
是否可以获取/保存/路由AVSpeechSynthesizer的输出,以便可以将其作为音频进行操作,以便我可以对音频(kAudioUnitSubType_Reverb2)运行音频处理然后播放它?
我正在使用两个应用程序模块:
1)具有此audioSession设置的录制模块:
try audioSession.setCategory(AVAudioSessionCategoryRecord)
try audioSession.setMode(AVAudioSessionModeMeasurement)
try audioSession.setPreferredIOBufferDuration(0.05)
try self.audioSession.setActive(true)
Run Code Online (Sandbox Code Playgroud)
2)具有此audioSession设置的录制模块:
try audioSession.setCategory(AVAudioSessionCategoryPlayback)
try audioSession.setMode(AVAudioSessionModeDefault)
try self.audioSession.setActive(true)
Run Code Online (Sandbox Code Playgroud)
对于从1-> 2和2-1的每个段落,我有一个 try self.audioSession.setActive(false)
如果我从1)模块传递到2)或重做1)一切正常.比起2)我来1)我得到这个错误try self.audioSession.setActive(true)
这是错误:
ERROR: [0x16e10b000] >avae> AVAudioIONodeImpl.mm:365:
_GetHWFormat: required condition is false: hwFormat
Run Code Online (Sandbox Code Playgroud)
这个错误与什么有关?我无法找到Apple iOS文档的任何帮助来了解问题所在.
有人有任何提示吗?
目前我正在开发一款使用iPad麦克风捕捉声音的iOS应用程序.同时,通过iPad扬声器播放声音.由于目标是处理隔离的输入声音,因此应删除(取消)扬声器反馈.我查找了一些与AudioToolbox可能性相关的文档.我发现AudioUnit可以执行回声消除等内置功能.但是,我没有设法正确配置我的音频图表以获得成功的性能.
我将不胜感激任何建议,示例代码,教程参考或推荐的参考书目.
非常感谢你,
普约尔