美文网首页iOS Developer程序员iOS音视频(直播 音频 视频)
全民K歌iOS端AudioQueue实现耳返功能(项目详解)

全民K歌iOS端AudioQueue实现耳返功能(项目详解)

作者: _小迷糊_997 | 来源:发表于2018-05-14 22:12 被阅读390次

前言

最近一直在做iOS音频相关技术的项目,期间在官方及网上的资料文档也学习了很多,当然,iOS平台中音频相关技术还是有很多方面的,然后以AudioUnit对耳返功能实现为例子来总结一下自己最近的收获,同时分享给大家。

技术点使用场景:

唱吧、全民K歌类似音乐项目中的,原唱和伴唱切换功能。

  • 这个当初实现的时候,差点搞残自己了。弄出来了,也拿来给大家做一个分享。我们团队面试经常拿这个问开发者。大家有兴趣可以学一下。
  • 如果有更好的实现策略和我讨论或者想拿源码和思维导图资料的, 请联系我时,备注一下AudioUnit耳返功能实现
  • 加我技术交流QQ群:656315826

AudioUnit耳返功能实现思路

这边使用AudioUnit录音,AudioQueue播放

  1. 创建AudioUnit对象,并初始化设置参数等
  2. 创建AudioQueue对象,初始化并设置参数
  3. 在AudioUnit回调方法中获取到采集到的数据,并将获取到的数据喂给AudioQueue的容器中,并给它播放

AudioUnit简介
AudioUnit这个名字取得还是比较形象的,它的主体就是一系列的unit,不同unit能够实现不同的功能,将一个或多个unit添加到AUGraph(Audio Processing Graph)中,并建立unit之间的连接,音频数据顺次通过各个节点即可完成我们最终需求。

AudioUnit
代码开始
  1. 使用AVAudioSession获取音频录制播放权限,并激活
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

[[AVAudioSession sharedInstance] setActive:YES error:nil];

  1. 创建AudioUnit
AudioComponentInstanceNew(_audioComponment, &_audioUint);
  1. 设置AudioUint
AudioUnitSetProperty(_audioUint,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input,
1,
&flagOne,
sizeof(flagOne));
AudioUnitSetProperty(_audioUint, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &asbd, sizeof(asbd));
AudioUnitSetProperty(_audioUint, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 1, &cb, sizeof(cb));
  1. 初始化/Start
AudioUnitInitialize(_audioUint);
AudioOutputUnitStart(_audioUint);
  1. 创建AudioQueue实例
AudioQueueNewOutput(&_asbd, BufferCallback, (__bridge void * _Nullable)(self), nil, nil, 0, &_audioQueue);
  1. 初始化音频缓冲区,这3个音频缓冲区地址不会改变,往里面填数据的时候,只是里面的数据变化而已(官方文档表明地址不可改变)
//初始化音频缓冲区
for (int i = 0; i < 3; i++) {
//创建buffer
result = AudioQueueAllocateBuffer(_audioQueue, 2048, &_audioQueueBuffers[i]);
if (result != noErr) {
NSLog(@"creat AudioQueue fail");
}
//初始化
memset(_audioQueueBuffers[i]->mAudioData, 0, 2048);
}
  1. AudioUnit回调中处理数据
AudioUnitRender(vc->_audioUint, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, &bufferList);

使用该函数来讲数据填充到我们创建的bufferList中
便于后续处理

void *data = malloc(bufferList.mBuffers[0].mDataByteSize);
memcpy(data, bufferList.mBuffers[0].mData, bufferList.mBuffers[0].mDataByteSize);
//play
AudioQueueBufferRef audioBuffer = NULL;
if (vc->_index == 2) {
vc->_index = 0;
}
audioBuffer = vc->_audioQueueBuffers[vc->_index];
vc->_index ++;
audioBuffer->mAudioDataByteSize = bufferList.mBuffers[0].mDataByteSize;
memset(audioBuffer->mAudioData, 0, bufferList.mBuffers[0].mDataByteSize);
memcpy(audioBuffer->mAudioData, data, bufferList.mBuffers[0].mDataByteSize);
//将数据压入AudioQueue播放缓存中
AudioQueueEnqueueBuffer(vc->_audioQueue, audioBuffer, 0, NULL);
free(data);
  1. AudioQueue的回调

项目代码获取

具体实现步骤,如下 具体步骤

有步骤讲解视频以及资料.因为简书文章没有地方放.大家可以加一下我的群获取一下。在群里讨论一下音视频技术这一块。
QQ群号:656315826.

相关文章

  • 全民K歌iOS端AudioQueue实现耳返功能(项目详解)

    前言 最近一直在做iOS音频相关技术的项目,期间在官方及网上的资料文档也学习了很多,当然,iOS平台中音频相关技术...

  • iOS使用AudioUnit/AudioQueue实现耳返功能

    首先理清思路我这边使用AudioUnit录音,AudioQueue播放1、创建AudioUnit对象,并初始化设置...

  • Flutter耳返和双声道功能的实现

    1 耳返功能简介 ZEGO Express SDK 提供了Flutter耳返和双声道的功能,在视频直播、K歌、音频...

  • AudioUnit录制音频+耳返(四)

    前言 视频直播,K歌应用等等都会有音频录制的功能,音频录制时还可以带有耳返效果,那这些是如何实现的呢?如果仅仅是录...

  • 全民k歌分析

    产品名称:全民k歌 体验版本:3.7.6 体验环境:ios 1,产品介绍: 《全民K歌》是一款由腾讯公司出k歌软件...

  • 全民K歌合唱分词功能改进

    全民K歌合唱分词功能改进 一.需求背景 许多用户在全民K歌发起合唱时会选择原唱为独唱的歌曲,这类歌曲中,全民K歌系...

  • 关于k歌

    一直以来,都很喜欢唱歌,当然是自己哼或者在ktv吼。 今晚在全民k歌的歌房戴着耳机唱,一百万个不习惯。 耳返的声音...

  • AVAudioEngine 实现耳返功能

    很简单,应该可以看懂吧 private var engine: AVAudioEngine? extension ...

  • 我给古诗词配的曲

    全民K歌里“青青子衿” 全民K歌

  • 在全民k歌里的历程

    2014年9月1日全民K歌在应用宝首发。《全民K歌》具有独创歌曲段落重唱功能,并拥有智能打分、趣味调音、好...

网友评论

  • 萧城x:你好 我想加群。不让加?

本文标题:全民K歌iOS端AudioQueue实现耳返功能(项目详解)

本文链接:https://www.haomeiwen.com/subject/bbhsdftx.html