iOS短视频源码音频采集过程中的音效实现

  • 时间:
  • 浏览:1

在移动短视频直播中, 声音是主播和观众互动的重要途径之一, 为了充沛直播的内容,亲戚亲戚亲戚朋友总我应该 应该 在声音上做或者 文章, 在短视频源码架构设计 录音的基础上玩或者 花样。

比如演唱类的直播间中, 主播伴随着背景音乐演唱. 这时或者 主播就会希望也能给当事人声音增加混响的效果, 营发明人人在舞台剧场等环境下演唱的氛围. 再比如或者 搞笑类的直播间, 主播会希望给当事人的声音加带变声的效果, 女变男,男变女可能变成机器人等等. 为了实现那此需求亲戚亲戚亲戚朋友须要对架构设计 的声音进行处理, 或者 为了让主播实时听到那此处理后的效果,以便根据效果进行调整,亲戚亲戚亲戚朋友也须要提供低延时的回放,将变化后的声音播放给主播听.对声音处理的方案比较多,这里介绍一下短视频直播SDK中所采用的基于iOS提供的AudioUnit的方案。

iOS系统提供了非常充沛的音频相关的API,含高了从架构设计 ,处理到播放等各个环节,或者 按照需求的层次进行了分组。

其中,离底层的驱动和硬件最近的可是 我AudioUnit系列的API,可是 我 或者 高层的API,全部总要对AudioUnit的封装. 比如AVFoundation、AudioQueue、AVAudioEngine等。

缺点:

涉及到的专有概念比较多,接口僵化 ,提供C风格的API

优点:

低延时,从架构设计 到播放回环还须要到10ms的级别还须要动态变更配置组合还须要直接获得后台执行权限

4.1 混响效果(reverberation)

亲戚亲戚亲戚朋友在音乐厅,剧院,礼堂等比较空旷的室内说话或唱歌时,往往能听到和平时不一样的声音,主可是 我声音在墙壁上多次反射后叠加带同时,听起来全部总要了混响的效果。在声音处理中,亲戚亲戚亲戚朋友还须要人为的将声音缓存起来,延时一定时间后,和原声音叠加,就也能模拟出混响的效果。AudioUnit提供了kAudioUnitSubType_Reverb2来实现混响效果的生成。将该unit接入到AUGraph中就让 ,配置参数即可实现混响的效果。虽然混响原理是比较简单,但实际上为了模拟自然界中实际的音效,计算过程还是相当僵化 的,要模拟出不同的大小的空间,不同材质的墙壁,障碍物的十几条 ,须要输入比较多的参数来参与运算。iOS的reverb unit提供了7个参数。亲戚亲戚亲戚朋友在直播应用中提供了有有另一个多不同场景的模拟(录音棚,演唱会,KTV,小舞台),主可是 我通过调整如下参数实现的:

kReverb2Param_DryWetMix混响效果声的大小与空间大小无关,而只与空间内杂物的十几条 以及墙壁及物体的材质有关;

kReverb2Param_DecayTimeAt0Hz / kReverb2Param_DecayTimeAtNyquist衰减时间,整个混响的总长度,与空间大小比较相关,越空旷越长。

4.2 变声效果

变声效果主可是 我在频域上对人的声音进行一定的处理,亲戚亲戚亲戚朋友知道男声一般比较低沉,女声比较尖锐,你是什么 主要说的是音调。通过对声音音调的调整,还须要让低沉的男声听上去像尖锐女声。iOS提供了kAudioUnitSubType_NewTimePitch的unit来实现音调的调整。值得注意的是kAudioUnitSubType_NewTimePitch全部总要输入Effect类的,可是 我属于FormatConverter类的。通过设置TimePitch unit的kNewTimePitchParam_Pitch属性即可。

/// pitchShift为具体数值(0表示不变,负数表明调低沉,正数调尖锐)AudioUnitSetParameter(pitchUnit, kNewTimePitchParam_Pitch, kAudioUnitScope_Global, 0, pitchShift, 0);

变男声,须要强化突出低沉的特点,将音调调低,设置负数参数即可;

变女声,须要强化突出尖锐的特点,将音调调高,设置正数即可;

机器人音效,机器人的音效是有有另一个多组合效果,亲戚亲戚亲戚朋友印象中的机器人音效全部总要老电影中的那种,音调比较高,或者 有重音。可是 我 亲戚亲戚亲戚朋友采用的是TimePitch unit + Delay unit的土土办法 。Delay unit也是iOS提供的有有另一个多将声音延时叠加的unit,或者 比混音要简单可是 我 ,可以 了单次叠加;

庄严宏大音效,想象一下佛祖相似的声音,一般全部总要自带回声,或者 比较男性化,可是 我 亲戚亲戚亲戚朋友选折 的是TimePitch unit + Reverb unit的土土办法 来实现。

这里推荐有有另一个多当事人调音效的参考软件voxal voice changer。亲戚亲戚亲戚朋友还须要在你是什么 软件上当事人将不同的工具组件组合起来,调试参数,实时听到参数对应的结果。当效果满意后再移植到AudioUnit中。

5.启动AUGraph。

在直播录制中比较关键的一步可是 我Render Callback Function。

AudioUnit每次全部总要处理一段音频数据,每次处理完成一段数据的就让 ,你是什么 回调函数就会被调用一次。在你是什么 回调函数中,通过AudioUnit的AudioUnitRender土土办法 ,还须要AUGraph中的某有有另一个多节点中获取到一段处理后的音频PCM数据。同时,可能须要进行耳返播放,在你是什么 回调中也须要将取得的音频数据送入到回调函数的最后有有另一个多参数ioData对应的buffer中。

在设置unit的属性时,须要注意的是或者 公共的属性。比如音频格式属性和MaximumFramesPerSlice。可能音频格式设置错误,往往会老出AUGraph启动失败可能声音异常等间题。比如,使用iOS内置的麦克风可能有线耳机时,设备支持的采样率比较高,44.1KHz 能正常工作,亲戚亲戚亲戚朋友整条音频通路上基本上都采用的是44.1KHz。或者 当使用蓝牙设备时,一般蓝牙设备无法支持44.1KHz架构设计 和播放,通常全部总要16KHz甚至更低。此时I/O Unit无法继续使用就让 的配置。须要按照实际支持的采样率进行配置。

AudioUnit须要求有有另一个多单元衔接处的音频数据格式须要保持一致,当AUGraph中不同unit支持的格式不同时(比如在支持蓝牙设备可能使用回声消除模块时,I/O unit要求的格式和或者 单元的有可能不同),此时就须要分别设置格式,并通过格式转换unit或mixer unit对格式进行转换。

可能MaximumFramesPerSlice设置错误,可能会老出声音异常的情况表。 MaximumFramesPerSlice 表示的是每次回调送入或取出的音频数据的长度,在AUGraph的所有节点的你是什么 属性也须要保持一致或者 会因为有的unit丢弃数据,而老出声音异常 。

其中,I/O主要负责和设备打交道,比如架构设计 和播放;Mixing负责将不同来源的音频数据进行混合;Effect是对音频数据进行音效处理;Format Conversion主可是 我进行格式转换比如重采样等。这里有有有另一个多优化的点是音频格式转换 Multichannel Mixer 并都有就也能实现格式转换的功能,输入和输出的音频数据格式还须要不同,利用你是什么 点还须要节省有有另一个多格式转换unit。