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

  • 时间:
  • 浏览:0
  • 来源:5分快乐8_5分快乐8官网

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丢弃数据,而经常冒出声音异常 。

在移动短视频直播中, 声音是主播和观众互动的重要途径之一, 为了富于直播的内容,亲戚亲戚让让让我们我们我们不我想要在声音上做许多文章, 在短视频源码下发录音的基础上玩许多花样。

比如演唱类的直播间中, 主播伴随着背景音乐演唱. 这时许多主播就会希望并能给自己声音增加混响的效果, 营发名者在舞台剧场等环境下演唱的氛围. 再比如许多搞笑类的直播间, 主播会希望给自己的声音加进去去变声的效果, 女变男,男变女不可能 变成机器人等等. 为了实现什么需求亲戚亲戚让让我们我们我们并能对下发的声音进行解决, 而是我为了让主播实时听到什么解决后的效果,以便根据效果进行调整,亲戚亲戚让让我们我们我们而是我能提供低延时的回放,将变化后的声音播放给主播听.对声音解决的方案比较多,这里介绍一下短视频直播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中。

其中,I/O主要负责和设备打交道,比如下发和播放;Mixing负责将不同来源的音频数据进行混合;Effect是对音频数据进行音效解决;Format Conversion主而是我进行格式转换比如重采样等。这里有一一个 优化的点是音频格式转换 Multichannel Mixer 两种就并能实现格式转换的功能,输入和输出的音频数据格式可不并能不同,利用这种 点可不并能节省一一个 格式转换unit。