前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >零基础快速搭建K歌应用【含源码】

零基础快速搭建K歌应用【含源码】

原创
作者头像
可可爱爱没有脑袋
修改于 2020-04-14 09:18:08
修改于 2020-04-14 09:18:08
4.2K0
举报
文章被收录于专栏:云+直播云+直播

点击观看大咖分享

玩法开天辟地,体验不留缝隙。K歌不遗余力,应用解决效益。总是羡慕别人家的“歌房”苦叹自家“茅草房”消除不了回音和混音?这次就将带你实战K歌功能,细分应用场景,提升产品表现,为你在“造房“路上“添砖加瓦“,给你最实用的”武器“,让你的”K歌房“摆脱尴尬的余音绕梁,从此高品质翱翔。看淡K歌之王,用技术推你做”K歌王中王“!

本期腾讯云大学大咖分享课程邀请到腾讯云高级工程师,主要从三个方面说明如何搭建K歌应用

  1. K歌功能应用场景和产品表现
  2. K歌功能技术实现方案
  3. K歌功能的开发实战

K歌的种类分为本地录制和在线歌房。

本地录制主要分两大模块:跟随伴奏唱歌录制和调音台。调音台用来通过调整人声位置来调整抢慢拍缺陷,调节人声及伴奏音量,混响及变声等音效。均衡器是对声音的不同频段进行增强或降低。例如,唱吧和全民K歌应用的都是本地录制模式。

在线歌房是房主的声音和伴奏通过网络编码发送给房间听众。例如,直播

本地录制流程

伴奏文件经解码转入播放设备,人声跟随伴奏录制后用采集设备进行人声伴奏的同步采集。通过回声消除将伴奏声音消除,留下人声,并存为人声临时文件。另一分支的耳返的作用是将人声送达至用户的耳朵。整个录制流程是人声经变声等设置后与伴奏形成耳返混音一并转入播放设备。录制后进行后期处理与伴奏最终生成音频文件。

技术应用

常见伴奏文件形式有mp3,ogg,acc,wav。大部分手机尽管支持MP3解码,但安卓机型容错能力较差,对异常MP3文件(MP3文件不完整或格式错误)通常无法播放。部分安卓系统支持ogg播放,但IOS系统全部不支持,这些情况都需要打包解码库。解码库的多样化可能造成的问题:对于app而言,音乐文件格式仅一种,并不需要占安装包的大小进行无用打包

解决方式:动态加载。即每个解码库单独操作为动态库(SO,DLL等)播放音乐时先加载动态库,可加载到就正常播放,加载不到就返回即库不存在。用户可灵活选择打包数量。可支持动态下载的动态库,例如安卓和Windows,在APP运行期间,根据文件格式选择库。

边下边播指的是边下载伴奏文件边播放,此时会出现卡顿问题。即便是本地文件,播放过程中也可能存在卡顿。

卡顿出现的原因:

  1. 解码线程和其他任务线程共用时,因其他任务过重导致编码不及时产生卡顿。因此编码需要使用单独线程。
  2. 设置缓存 单独线程的卡顿,在如今的并发系统中线程的调度是通过时间片轮巡的,不使用Buffer时,当设备需要数据,线程未被调度就会引起卡顿。

录制

录制部分需要回声消除即播放的部分无需采集。通常为系统自带功能,例如在通话时开通扬声器,对方的声音不会被采集后转发回去。系统回声消除存在一定局限性,例如只支持在通话情况下开启回声消除,媒体音量开启并无效果,有些设备显示返回失败。通话条件下开启回声消除时采样率降低。因在高采样率下,采集到的声音频段丰富,回声消除操作对算法和设备性能要求高。K歌场景下,如果用16k,很难满足用户需求,所以采用采样率为44.1k的自研回声消除。

在t0时刻,伴奏经解码后播放,从播放到用户接受到伴奏存在的时间间隔称为播放延迟。IOS系统,播放延时小。安卓系统相对较大,一般播放延时为几百毫秒。从用户开始唱歌到t1时刻人声伴奏采集到内存称为采集延迟。采集延迟和播放延迟时间相似,安卓设备的两个延迟一般是100~200ms。在t1时刻下采集到t0时刻的伴奏,为实现人声伴奏对齐需要计算出t0和t1的时间间隔。通过计算播放延迟和采集延迟或一并计算总延迟。例如,计算总延迟,先播放一段测试声音,采集后对比两个信号的偏移情况得出结果。计算总延迟的方法相对精确,实验室常用此方法,但此方法并不适合线上环境,很难实现在唱歌前播放一段测试音乐,这种情况下采用分段计算即可。播放延迟分为两部分,获取数据时的buffer最小值为mini buffer,可根据码率声噪等计算出时长。获取mini buffer后,对100款主流机型进行测试得出播放延迟大约为mini buffer的二倍。同理可得采集延迟。人声伴奏对齐主要关注开始播放时,按播放采集延时计算,暂停后重新对齐。

混响

混响是声源发出声音后被反射物反射,反射后的声音与声源声音相结合出的声音。

混响的影响因素:反射物的远近,多少和材质。反射物的远近决定反射声音的到达时间,例如房间里回声快速到达,山谷回音经久不息。反射物的多少决定反射信号的多少,例如山谷里的回声清晰可辨,房间里回声难以分辨。反射物的材质决定混响时间,反射物多,信号被吸收的多,声音持续时间短。

以下为原声和空灵两模式的对比图。空灵模式下,直达声和反射声距离长,所谓山谷回音。

原声是在房间里的说话状态,左边的长线段为直达声,反射声随之到达,很难进行区分。房间内物体多,吸收声音效果强,混响时间短。第一个反射声到达时间,反射声多少,混响持续时间决定混响程度。通过8种混响模式对以上三种因素进行调节,下文demo操作时会具体呈现。

均衡器

均衡器是对不同频率的声音进行缩放。下图是一段录音经傅里叶变换后发现一个声音由很多频率的声音构成。此录音在1000Hz之前相对较大,随之缩小,16000Hz之后能量几乎为零。根据频率图,我们可以对不同频段的声音进行放大或缩小。低频声音若饱满,则说明低频信号较合适,若低频信号小,声音较为单薄。低频信号高,信号较厚重。高频信号较为明快。一般来说均衡器支持以下10级。下方的数字说明的是一个区间值,例如31,是均衡31~61这段区间的区间值。

变声

变声支持12类型:萝莉,大叔,熊孩子,感冒,困兽,空灵肥仔,重金属,外国人,重机械,强电流,土话。根据以上声音特点使用的技术方法并非单一,例如萝莉和大叔两种,通过升降频率实现,空灵通过混响来实现。

以下是原声和萝莉的语谱图,横坐标为时间,纵坐标为频率。颜色代表特定时间点下,某频率的声音强度。原声的声音频率较窄,为16000Hz以下。萝莉音频率被拉长,一些低频音被放大为高频,频率为14000Hz左右。可以用QQ语音消息进行体验,和GME的K歌功能一样,都是音视频实验室研发的。

在线K歌

在线K歌发送端和稳定录制相似,增加了编码这一项。根据流程图所示,编码后发包,收包等,最后解码播放。

K歌房考虑因素:伴奏,人声,歌词同步。和上述伴奏人声同步不同的是,虽然本地伴奏与人声同步,但发送期间由于网络延迟不固定,接收端收到后,伴奏和人声还是会有偏移。因此伴奏和人声需要混音发送。歌词同步就是时间戳的同步,根据当前收到的声音所在时间

来展示歌词。展示歌词分逐字展示和逐句展示,逐字对时延要求较高。

同步时间戳的两种方式:

1开始时发送信令,然后暂停或结束再次发送信令,对方根据接收时间,通过计时器的累加决定伴奏的时间。这种方式的好处不需要改变音频帧的格式,如果音频帧的扩展性不好,可采用此方式。

2 如果音频帧的扩展性较好,对时间戳精度要求高,则需要把当前伴奏的时间戳放在音频帧的头或尾,与音频帧一同传送。此种方式实施效果好,目前我们采用此方式。

延迟控制

延迟控制主要控制直播场景中,说话者的声音经网络发送到听者的时间。这个时间可细分为播放和采集延时,设备相关问题可控范围小。另一个原因是网络传输,可通过增加后台服务器,使每个用户就近连接,通过最近通路传输。

延迟的另一个类型是由网络收发包buffer引起的延迟。音频数据通过UDT形式传输,而UDT不能保证持续性。例如有三个音频包,可能接受顺序是混乱的,部分音频包会被丢弃,导致声音断断续续并不完整。因此,延迟也并非越小越好。我们需要对不同场景进行优化,比如直播模式无交互,听众不会和直播者互动,只需保证直播人的声音和画面是同步的,即使晚几秒传输,听众是无法明显察觉的。在这种情况下先保证避免卡顿,延时可略微增加。

连麦模式是在直播的过程中实现听众与直播者的互动,这种情况下对实时性要求较高。因此连麦模式需要低延时,卡顿可略微存在。不同模式的侧重点不同,需根据具体场景调整参数。

录制过程中,只有一位录制者时,录制并上传即可。如果多人参与录制,则采取后台录制,即后台统一解码多人声音,生成文件,录制结束时,返回服务器地址,即可进行观看。

以下是实现一个简单的本地录制功能的实战演练环节。

加文章结尾“学习君”微信可获取课程资料。

代码语言:txt
AI代码解释
复制
1、初始化 
   ITMGContext.GetInstance(this).Init(String.valueOf(mAppId), mUserId);//初始化sdk,用来登录
   ITMGContext.GetInstance(this).SetTMGDelegate(new MyDelegate());//设置代理类,用来接受各种回调和事件
   EnginePollHelper.createEnginePollHelper();//定时去调用Poll函数,可以用这个辅助类,也可以在某个周期函数中调用
2、进房
        byte[] authbuff = AuthBuffer.getInstance().genAuthBuffer(mAppId, mRoomId, mUserId,mAppKey);//获得鉴权信息,最好放在server
    ITMGContext.GetInstance(this).EnterRoom(mRoomId, 2, authbuff);//进入房间
3、K歌相关接口

        /*功能:开始录制
        **参数:
        **type:K歌场景传ITMG_AUDIO_RECORDING_KTV
        **dstFile:目标文件路径,用于保存录制完成的音乐
        **accMixFile:一般是没有原声的伴奏,用来和人声合成音乐文件
        **accPlayFile:用于播放的音乐文件,正常情况下和accMixFile是同一个文件。但在用户不熟悉歌曲的时候,可以是带原唱的音乐文件
        */
    int StartRecord(int type, String dstFile, String accMixFile, String accPlayFile);
        
        /*功能:停止录制*/
    int StopRecord();
        
        /*功能:暂停录制*/
    int PauseRecord();
        
        /*功能:继续录制*/
    int ResumeRecord();
        
        /*功能:设置播放用的音乐文件,一般用于在原唱和纯音伴奏之间切换
        **参数:accPlayFile,用于播放的音乐文件
        */
    int SetAccompanyFile(String accPlayFile);
        
        /*功能:获取伴奏文件的长度*/
    int GetAccompanyTotalTimeByMs();
        
        /*功能:获取当前录制了多长时间*/
    int GetRecordTimeByMs();
        
        /*功能:将录制时间跳转到指定时刻。如果参数比当前时间靠前,则重复的地方重新录制;比当前时间靠后,则用静音数据填充没有录制的部分
        **参数:timeMs,跳转的时刻,单位ms
        */
    int SetRecordTimeByMs(int timeMs);
        
        /*功能:设置音效
        **参数:type音效类型,参见ITMG_KaraokeType
        */
    int SetRecordKaraokeType(int type);
        
        /*功能:获得录制文件的长度*/
    int GetRecordFileDurationByMs();

        /*功能:开始预览录制文件*/
    int StartPreview();
        
        /*功能:停止预览录制文件*/
    int StopPreview();
        
        /*功能:暂停预览录制文件*/
    int PausePreview();
        
        /*功能:继续预览录制文件*/
    int ResumePreview();
        
        /*功能:设置当前预览的时间点
        **参数:time,预览文件的时间点单位ms
        */
    int SetPreviewTimeByMs(int time);
        
        /*功能:获取当前预览的时间点*/
    int GetPreviewTimeByMs();

        /*功能:设置人声和伴奏的缩放比例
        **参数:
        **mic:人声的缩放比例,1.0为原来音量,小于1.0为缩小,大于1.0为放大
        **acc:伴奏的缩放比例,1.0为原来音量,小于1.0为缩小,大于1.0为放大
        */
    int SetMixWieghts(float mic, float acc);
        
        /*功能:设置人声相对于伴奏的偏移,一般用于调整声音跟不上节拍的问题
        **参数:time,人声相对于伴奏的偏移时间,单位ms。大于0为向后移动,小于0为向前移动
        */
    int AdjustAudioTimeByMs(int time);
        
        /*功能:将录制好的人声和伴奏合并成一个文件*/
    int MixRecordFile();
        
        /*功能:取消合并操作*/
    int CancelMixRecordFile();
        
        
        需要监听的事件:
        /*功能:录制完成的回调。伴奏播放结束或者调用StopRecord触发
        **参数:
        **result:录制结果错误码,0为成功
        **filepath:目标文件的路径,StartRecord传入的
        **duration:录制文件的长度,单位ms
        */
        ITMG_MAIN_EVENT_TYPE_RECORD_COMPLETED        

        /*功能:预览完成的回调。预览文件播放结束或者调用StopPreview触发
        **参数:result,播放结果错误码
        */
    ITMG_MAIN_EVENT_TYPE_RECORD_PREVIEW_COMPLETED
        
        /*功能:合成文件完成的回调。合成文件完成触发,完成之前调用CancelMixRecordFile则没有回调
        **参数:
        **result:合成结果错误码,0为成功
        **filepath:目标文件的路径,StartRecord传入的
        **duration:录制文件的长度,单位ms
        */        
    ITMG_MAIN_EVENT_TYPE_RECORD_MIX_COMPLETED(32)
    
接口详细说明参见:https://cloud.tencent.com/document/product/607

问卷

为了给广大开发者提供最实用、最热门前沿、最干货的视频教程,请让我们听到你的需要,感谢您的时间!点击填写 问卷

关注“腾讯云大学”公众号,回复【加群】进入交流群
关注“腾讯云大学”公众号,回复【加群】进入交流群

腾讯云大学是腾讯云旗下面向云生态用户的一站式学习成长平台。腾讯云大学大咖分享邀请行业技术大咖,为你提供免费、专业、行业最新技术动态分享。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于Prometheus与Grafana构建实时监控与告警体系,保障微服务稳定性!
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2025/02/25
2321
从Zabbix到Prometheus,同程艺龙数据库监控系统的实践
闫晓宇,同程艺龙数据库技术专家,具有多年互联网行业DB运维经验,在游戏、O2O及电商行业从事过DBA运维工作。2016年加入同程艺龙,目前在团队负责数据库架构设计及优化、运维自动化、MySQL监控体系建设、DB私有云平台设计及开发工作。
用户1278550
2019/10/28
2.1K1
从Zabbix到Prometheus,同程艺龙数据库监控系统的实践
彻底搞懂监控系统,使用Prometheus +Grafana搭建完整的应用监控系统
监控是运维系统的基础,我们衡量一个公司/部门的运维水平,看他们的监控系统就可以了。一个完善的监控系统可以提高应用的可用性和可靠性,在提供更优质服务的前提下,降低运维的投入和工作量,为用户带来更多的商业利益和客户体验。下面就带大家彻底搞懂监控系统,使用Prometheus +Grafana搭建完整的应用监控系统。
章为忠学架构
2023/03/23
13.5K0
彻底搞懂监控系统,使用Prometheus +Grafana搭建完整的应用监控系统
运维实战|快速搭建适配 YashanDB 的 Prometheus Exporter!手把手教学
今天分享一份来自用户的实战投稿:如何快速构建一个适用于 YashanDB 的 Prometheus Exporter,打通监控链路,实现数据库指标实时采集和可视化展示。实操内容详细到位,非常值得一学!
数据库砖家
2025/04/27
580
一文搞懂Prometheus、Grafana(含腾讯云上实战)
通常来说,对于一个运行时的复杂系统,如果系统出了问题是很难排查的。因为你是不太可能在运行时一边检查代码一边调试的。因此,你需要在各种关键点加上监控,通过监控获取的数据,指导我们进一步工作,解决问题。
yuann
2021/01/06
61.1K2
一文搞懂Prometheus、Grafana(含腾讯云上实战)
手把手教你掌握数据库的“生存技能”:从零开始成为靠谱DBA
最近总有小老弟问我:“哥,我想转行当DBA,该咋整啊?” 问得好!今天就掏心窝子聊聊,怎么用最接地气的方式,把数据库玩得明明白白。咱不说虚的,直接上干货,看完这篇你至少能少走三年弯路!
IT咸鱼
2025/05/20
780
手把手教你掌握数据库的“生存技能”:从零开始成为靠谱DBA
初试 Prometheus + Grafana 监控系统搭建并监控 Mysql
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aixiaoyang168/article/details/81354059
哎_小羊
2019/05/25
2.1K0
这款 7k Star 的国产监控系统,真不错!
我们都知道天下没有“永不宕机”的系统,但每次线上出问题都要拉出一个程序员“祭天”。所以一款靠谱、好用的监控工具就显得十分重要,它可以在生产环境出故障的第一时间发出告警,并提供详实的数据,帮助程序员尽早发现故障、尽快定位问题。
HelloGitHub
2023/10/19
1K0
这款 7k Star 的国产监控系统,真不错!
成为优秀DBA工程师:PostgreSQL安全加固与日志分析全攻略
pgBadger是PostgreSQL的“行车记录仪”,帮你揪出慢查询和性能问题!
IT咸鱼
2025/05/20
1220
成为优秀DBA工程师:PostgreSQL安全加固与日志分析全攻略
构建你的第一个仪表盘!Grafana 中文入门教程
比如说,需要计算资源的时候,一个配置文件就可以要来两百台虚拟化好的机子。需要试下缓存?点下鼠标就可以要到几十个配置好的 Redis 结点。
民工哥
2022/10/27
3.9K0
构建你的第一个仪表盘!Grafana 中文入门教程
Grafana 中文入门教程 | 构建你的第一个仪表盘
比如说,需要计算资源的时候,一个配置文件就可以要来两百台虚拟化好的机子。需要试下缓存?点下鼠标就可以要到几十个配置好的 Redis 结点。
杰哥的IT之旅
2021/03/30
115.9K0
Grafana 中文入门教程 | 构建你的第一个仪表盘
构建企业级监控平台系列(二十七):Grafana 基础入门与部署
Grafana 是一跨平台的开源的可视化分析工具。目前网络架构和应用分析中最流行的时序数据展示工具,主要用于大规模指标数据的可视化展示。
民工哥
2023/11/06
3.2K0
构建企业级监控平台系列(二十七):Grafana 基础入门与部署
Grafana+Prometheus打造全方位立体监控系统
前言 本文主要介绍如何使用Grafana和Prometheus以及node_exporter对Linux服务器性能进行监控。下面两张图分别是两台服务器: 服务器A 服务器B 概述 Prometheus
小柒2012
2018/04/13
2.4K0
Grafana+Prometheus打造全方位立体监控系统
监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库
俗话说,没有监控的系统就是在裸奔,好的监控就是运维人员的第三只手,第三只眼。本文将使用prometheus及Grafana搭建一套监控系统来监控主机及数据库(MySQL、Redis)。
俊才
2019/08/30
3.2K0
监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库
图文结合丨Prometheus+Grafana+GreatSQL性能监控系统搭建指南(上)
官网下载最新二进制安装包➥ https://prometheus.io/download/
GreatSQL社区
2023/10/09
7260
图文结合丨Prometheus+Grafana+GreatSQL性能监控系统搭建指南(上)
实战 Prometheus 搭建监控系统
Prometheus 是一款基于时序数据库的开源监控告警系统,说起 Prometheus 则不得不提 SoundCloud,这是一个在线音乐分享的平台,类似于做视频分享的 YouTube,由于他们在微服务架构的道路上越走越远,出现了成百上千的服务,使用传统的监控系统 StatsD 和 Graphite 存在大量的局限性,于是他们在 2012 年开始着手开发一套全新的监控系统。Prometheus 的原作者是 Matt T. Proud,他也是在 2012 年加入 SoundCloud 的,实际上,在加入 SoundCloud 之前,Matt 一直就职于 Google,他从 Google 的集群管理器 Borg 和它的监控系统 Borgmon 中获取灵感,开发了开源的监控系统 Prometheus,和 Google 的很多项目一样,使用的编程语言是 Go。
Spark学习技巧
2021/03/05
1.3K0
实战 Prometheus 搭建监控系统
使用 Prometheus 和 Grafana 监控 Linux 进程
无论你是 Linux 系统管理员或是 DevOps 工程师,你都会在监控服务器性能指标的时候花费很长时间。
LinuxSuRen
2020/06/17
5.7K0
如何用Prometheus + Grafana 搭建实时监控体系
微服务带来了高可用性、灵活性和,但是也带来了一些新的挑战。还记得我刚开始学习Java的时候愧,看到过一个问题:为什么xx游戏不使用微服务架构? 我记得当时在那篇博客中的答案是:“微服务将服务模块化,但是模块之间通信会带来网络延时,影响游戏体验。”
叫我阿柒啊
2025/02/28
3390
如何用Prometheus + Grafana 搭建实时监控体系
基于Grafana+Prometheus搭建可视化监控系统实践
Grafana:一个监控仪表系统,可以根据提供的监控数据,生产可视化仪表盘,同时也具有告警通知功能。这里的监控数据来源,目前主要以Prometheus为主(也支持其它数据源),每次展现仪表盘时,都会向Prometheus服务发送一个查询请求,从而拿到监控数据并构建可视化仪表盘。
诺诺的包包
2024/01/27
6010
基于Grafana+Prometheus搭建可视化监控系统实践
日志看懂了吗?DBA必会的性能监控工具Prometheus、Zabbix、Nagios攻略
作为DBA工程师,你会发现数据库性能出现问题时,监控工具就像医生的听诊器。掌握性能监控工具使用方法,不仅能及时发现风险,还能准确定位问题。今天,我和你聊聊三款主流监控工具的特点、搭建方法和实际调试经验——无论你是管理云原生环境还是传统IT系统,都能从中获得有用的信息。下面我将分部分介绍。
IT咸鱼
2025/05/20
1430
日志看懂了吗?DBA必会的性能监控工具Prometheus、Zabbix、Nagios攻略
推荐阅读
相关推荐
基于Prometheus与Grafana构建实时监控与告警体系,保障微服务稳定性!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档