K 歌还能这样玩?详解回森“音乐弹幕”功能背后的技术实践!
![K歌还能这样玩?详解回森“音乐弹幕”功能背后的技术实践!](https://static001.geekbang.org/infoq/1a/1a76c16f4b9c4fb4677f6623b71259b0.jpeg)
在上篇文章中,我们深入剖析了 K 歌社区所面临的挑战与困境,以及回森是如何思考的。(点击回看:音乐弹幕?智能修音?回森 K 歌社区的创新玩法?(上))其中,音乐弹幕作为回森最为特色的功能之一,它不仅巧妙地解决了 K 歌社区面临的短视频平台冲击问题,更为回森用户带来了前所未有的产品体验。回森的音乐弹幕技术,不仅展现了其强大的独创性,更体现了技术的先进性。它不仅仅是一个简单的互动工具,更是回森精心打造的一个独特的音乐社交生态的核心。通过与产运团队的紧密配合,回森成功构建了一个独有的音乐弹幕生态,为用户创造了一个充满活力和创造力的音乐社交空间。本篇文章将会为你揭秘音乐弹幕的功能背后技术实现过程……
一、K 歌社区的玩法创新-音乐弹幕
再来看一下音乐弹幕的视频录屏:
从上述视频展示中,我们可以清晰地看到音乐弹幕这一功能如何将用户的录音巧妙地融入到视频作品中,实现同步播放,营造出引人入胜的合唱效果,这种产品形态极大地丰富了用户的互动体验。接下来,让我们一同深入剖析音乐弹幕中三个关键角色——弹幕生产者、作品作者以及消费者,他们的行为特点与核心体验。
二、音乐弹幕分角色核心行为
![](https://static001.geekbang.org/infoq/4a/4af874eedab5d198fbc00bb820c498fb.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
从上面视频上可以看出,音乐弹幕是一种用户发送录音到视频作品上,并可同步播放形成类似合唱效果的一种产品形态,它可以达到平台想要的互动性玩法的目的。在上文分析 K 歌社区困境中可以看到,K 歌作品的视觉消费性、互动反馈性都比较差,文字评论内容很单一(好听、来啦、甜妹等等),用户很难基于作品内容发生互动,而音乐弹幕恰恰解决了这个问题。
2.1 弹幕生产者
弹幕生产者的核心行为涵盖三个自然连贯的步骤:按住按钮录制弹幕、松开手指预览弹幕与上传弹幕。这一系列的设计借鉴了微信发送语音消息,使用户能够轻松上手。在录制弹幕的过程中,用户的核心体验是入唱节奏的顺畅,确保他们能够跟随音乐的节拍,自由表达情感和创意。而在预览阶段,用户将关注音量配比的合理性,即确保自己的弹幕声音与视频原声音量的和谐共存,以及弹幕内容与视频内容的精准对齐,从而呈现最佳的视听效果。一旦弹幕成功上传到服务器,作品的作者将会收到一条 Push 通知,告知他们:“用户 xxx 已向你发送了一条弹幕”。
2.2 作品作者
当作品作者收到一条新的弹幕时,这无疑是一种强烈的激励,它象征着观众对作者作品的喜爱和认可。作者往往会迫不及待地点进去收听这条弹幕,以感受观众的热情与创意。如果这条弹幕的声音与作者的歌声相得益彰,作者通常会选择“Pick”这条弹幕,使其与作品一同展示。当其他用户再次观看这个作品时,他们将能够听到作品与弹幕共同构成的合唱效果。作为作品作者,他们的核心体验主要围绕两个方面:“Solo 播放”和“精准 Seek”。
Solo 播放:当作品作者的作品被 Pick 了多个弹幕时,为了确保他们能够清晰地听到当前弹幕与作品的混音效果,收听新弹幕时需要实现仅播放该条弹幕与作品的混音结果,而其他所有弹幕则需要被静音处理。
精准 Seek:熟悉音视频开发的同学知道,视频编码中有一个 GOP 的概念,为了优化播放流畅性和编码效率,Seek 操作通常会定位到 GOP 的起始位置,而视频 GOP 的设置通常间隔是 4s。然而,对于希望立即听到特定位置弹幕的作者来说,等待 3~4 秒的体验显然不够理想。所谓精准 Seek 其实就是想跳到视频的什么位置就可以立马到什么位置,所以在这里使用精准 Seek 来优化作者收听弹幕的体验,当他去点击播放弹幕的时候,只需要在两三百毫秒以后就可以听到这一条弹幕的效果了。
2.3 消费者
消费者期望在 K 歌社区中体验到的是最终呈现的合唱效果,这是一种将所有弹幕与原始作品精确对齐并混音播放的效果。除了沉浸在美妙的合唱声中,消费者同样可以积极参与互动,对喜欢的弹幕进行评论、点赞等操作,表达他们的喜爱与支持。对于消费者而言,核心体验在于混音的平滑程度。为了确保这一体验的完美呈现,关键技术实现包括多轨混音和弹幕下载等策略。
在深入剖析了弹幕系统中三个关键角色——弹幕生产者、作品作者和消费者的行为与核心体验之后,接下来我们将在四个方面详细解读弹幕系统的架构设计与关键技术实现:弹幕消费端、生产端、分享机制,以及性能与扩展性。
三、音乐弹幕消费端核心实现
3.1 基础架构
![](https://static001.geekbang.org/infoq/0d/0d2ccfc17b17e458c6eec7ef9d45f360.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
在构建音乐弹幕系统时,我们首先自主研发了一套底层播放器内核,并在其中巧妙的接入了弹幕混音模块。这个混音模块的主要职责是将用户上传的每一条弹幕音频与作品的原始音频进行精细混合,为用户呈现一个丰富而和谐的合唱效果。为了实现这一功能,我们精心设计了多个核心模块:弹幕解码模块、解码任务调度模块(有的作品会达几百条弹幕),音量配比和弹幕对齐混音模块等(如上图右侧)。
尽管市面上有很多竞品试图模仿我们的弹幕产品形态,但真正能够成功复制我们体验却寥寥无几。这其中的核心原因之一就是我们在技术实现以及对音频、音乐领域的深厚积累。特别是在弹幕对齐这一关键环节上,我们采用了先进的算法和技术手段,确保每一条弹幕音频都能与作品的原始音频实现精准对齐,为用户带来更为流畅和自然的观看体验。
接下来,我们将详细解析弹幕对齐的实现原理和技术细节,让大家更加深入地了解我们的技术实力和产品优势。
3.1.1 消费侧对齐实现详解
![](https://static001.geekbang.org/infoq/09/097efad83ab0aaa4afea6db399d23c2a.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
该图描绘了回森线上场景中,视频作品和弹幕共生的和谐画面。其中,绿色横条代表了视频作品的音频轨,也就是通常所指的视频主轨。而“弹幕排列”部分则代表了创作者精心挑选的弹幕,此处我们假设展示了 100 条弹幕作为示例(实际数量可能多达两三百条)。
当播放器核心解码出视频主轨的音频 buffer 时,这个 buffer 会附带其开始时间和时长信息。弹幕混音模块会迅速响应,基于主轨的时间轴,精确匹配当前时刻活跃且适合播放的弹幕进行解码。解码后的弹幕音频会进一步被细分为以 5 毫秒为单位的 PCM(脉冲编码调制)buffer,并与主轨音频进行精确对齐。如果同一时刻有多条弹幕同时发出,混音模块会将其音频进行混合处理,随后再与视频主轨的音频进行混音,确保用户既能听到作品的主旋律,也能感受到弹幕带来的丰富合唱效果。然而,在这一过程中,最关键的细节之一便是音量配比的处理。接下来,我们将深入探讨多条弹幕同时存在时的音量配比策略。
3.1.2 音量配比详解
![](https://static001.geekbang.org/infoq/95/95c48aa76d342921c763bcd82532397e.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
随着多轨混音的加入,每新增一条弹幕参与混音,整体声音的能量就会相应增强。如果弹幕数量持续增加,视频主轨的声音可能会受到削弱,导致作品作者的特点变得不那么突出。因此,为了提供最佳的用户体验,我们需要根据每个时刻参与混音的弹幕数量动态调整每条弹幕的音量。讲到这里不得不提到在回森团队,有一位既懂产品、又懂音乐还懂程序员的老师,回森里面很多的混音、音效相关的精细化策略都是他一手制定的。在他的帮助下,我们共同设计并实现了一套防止爆音、音量配比、音量平滑和弹幕主态音量加成的多轨弹幕混音策略(如上图所示)。这些策略要求技术团队在实现时要做到极致精细,哪怕是最微小的杂音,都逃不过用户的耳朵。人类对的生理结构决定了对声音敏感程度是高于画面的,就像电影是 30fps 还是 24fps 普通人可能没太有感觉,但对于任何杂音,任何人都会感到十分不适。接下来,我们将转向生产端的核心实现部分,深入探讨其背后的技术细节。
四、音乐弹幕生产端核心实现
![](https://static001.geekbang.org/infoq/6a/6aefbf4d808745a59a4b54f1490532a6.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
当用户按下“按住唱”按钮的那一刻,弹幕的生产流程便开启了。首先,系统会调用视频播放器,使其暂时静音其他弹幕,同时降低底轨作品的音量(特别是在外放录制场景中),并激活录音模块开始采集用户声音。在用户松开“按住唱”按钮后,离线处理模块立即介入,执行自动音量和音效的精细处理,随后将处理完成的弹幕文件及 Meta 数据上传至云端,完成弹幕的生产流程。在整个过程中,有几项核心要素至关重要:
4.1 按住唱的流畅与高音质体验
按住唱瞬间的流畅体验:在启动录音器的瞬间,必须确保底板作品不会出现杂音或突变,尤其在 iOS 端使用蓝牙耳机录制时,我们根据不同耳机外设进行相应 Category 的设置,保证用户从观看作品到按住唱的流畅体验。
外放 AEC 处理:在不插耳机录制弹幕的场景下,扬声器外放出来的底板声音会被再一次录制进入到弹幕中,导致最终将弹幕与底板混音的效果会大打折扣。特别是在多人参与演唱弹幕时,回声的反复录制会对整体的混音音质产生严重损害。针对这一问题,快手的音频算法团队开发了一种基于深度学习的回声消除(AEC)算法。这一算法有效地避免了传统算法通常会出现的回声消除量不足或对用户歌声造成损伤等问题,实现了高音质回声消除的突破,并且还兼具去除录制环境中的噪声的功能。
蓝牙耳机处理:蓝牙耳机录制弹幕场景下,为了使得录入音质更高(提高人声录入采样率),采用机身麦克风采集音频。
4.2 对齐
对齐思路:
在 iOS 平台上,如果用户不使用蓝牙耳机,我们会保证录制弹幕声音与主轨声音是完美对齐。而在使用蓝牙耳机的情况下,我们根据测试结果设定了一个默认对齐值,同时也支持用户手动调节。
在 Android 平台上,当未使用耳机时,我们将采用自动对齐策略,并且把对齐值进行持久化,这个对齐值将作为用户在带耳机录制时的初始对齐值,同时用户也可以根据需要手动调整对齐数值。
自动对齐:我们使用了快手音频算法团队的自动对齐能力,利用基于音频相关性的延迟估计算法,在用户录制弹幕阶段实时计算出系统延迟,并在录制结束后给出估计值,补偿由于系统延迟引入的歌声错位问题,这在多条语音弹幕同时播放时极大缓解了合唱不齐的问题,显著提升了用户体验。
4.3 自动音量
底板作品的音量在不同作品之间,以及相同作品不同时间段都会有所不同。同时用户手机设备以及音量设置也不尽相同。所以为了得到弹幕与作品之间一个合适的音量配比值,我们会综合考虑弹幕演唱时间段内的底板作品音量和弹幕录制音量,并进行一次 AGC 计算,得到一个音量增益,并将该增益作用到弹幕上。整体策略如下:
用户按住唱弹幕:
录音模块的音量检测开始工作,将实时录制进去的人声,送入 VoiceDetector 模块检测人声音量。
视频播放器的音量检测模块开始工作,将正在播放的底板作品声音送入 VoiceDetector 模块检测底板作品的音量。
用户完成录制弹幕:
停止检测人声音量,得到自己唱的这个弹幕的音量值计为 vocalDB。
停止检测底板作品的音量,得到底板作品在这个时间段内的音量值计为 bgmDB。
利用 vocalDB 和 bgmDB 计算得到一个 AGCGain(自动增益数值),将录制出来的弹幕经过离线处理模块(offlineConvertor)进行编码和上传。
4.4 精准 Seek
为了确保弹幕作者在演唱完成后能立即听到自己与底板作品同步播放的效果,以及底板作者在收到其他用户弹幕后能进行流畅、无缝的预览操作,我们引入了精准 Seek 功能。传统的 seek 操作通常基于关键帧进行跳转,而关键帧的间隔可能长达 4 秒甚至 8 秒,这对于追求即时性和无缝体验的音乐弹幕系统来说,显然是不够理想的。因此,我们开发了精准 Seek 功能,以满足用户对快速、准确跳转的需求。具体是实现方式如下:
视频 seek 到上一个关键帧,然后一直解码视频到目标位置,解码后的 YUV 数据直接抛弃,到达了预定位置就开始缓存入视频队列。
音频 Demux 出来之后,判断 position 在目标位置 300ms 的地方开始解码,否则直接跳过,到达了预定位置缓存入音频队列。
每一次 seek 为了播放顺滑,做一个 300ms 的 Fade-In。
五、音乐弹幕作品的分享
一个用户如果觉得某个作品的合唱效果很赞,或者朋友之间分享自己制作的弹幕作品,我们需要给用户提供分享方式,常规的分享方式有两种:
端外 H5 分享:直接将作品的 H5 链接分享出去;
保存视频到本地:将作品保存成一个带有弹幕的完整的视频,存储到相册中;
而这两种方式的底层实现是完全不同的,下面重点详细拆解端外 H5 分享:
端外 H5 分享
在用户将精彩作品分享到微信或者 QQ 好友的场景,其他用户点击打开需要一个端外的 H5 落地页面来展示弹幕和作品 Mix 播放的效果。常规的分享实现是服务端来进行混音,然后 H5 仅负责播放。但回森的弹幕场景特点是作品上的弹幕是随时可变的(弹幕数量、弹幕对齐、弹幕音量等都是可变的),如果每次变化服务端都要重新合成一个作品,这对于服务端的计算、存储以及 CDN 的缓存命中率都非常不友好,并且实时性也会有问题。为了达到最佳体验,最终我们采用了前端实时混音处理的技术方案:
拆分原始作品:首先在服务端将视频底板拆分为音频和静音视频两个文件;
实时混音与播放:
将弹幕下载,然后利用 AudioContext 来创建 buffer,实时解码弹幕和混音(混音模块策略与客户端相同),最后进行播放;
静音视频向音频进行同步达到音视频同步播放的效果;
通过这种实现,我们不但保证了端外与端内的实时一致性,同时也优化了非常大的算力、存储以及缓存命中率。
六、音乐弹幕的性能与扩展性
6.1 性能
每个作品能 pick 上屏的弹幕数是没有限制的,为了达到顺畅的性能体验,我们对弹幕的整体链路做了较多的性能优化工作,核心可以总结为以下几点:
弹幕下载时机:为了不影响视频秒开效果,要在视频秒开之后再下载弹幕文件。
弹幕渐进式下载:如果一开始就下载作品的所有弹幕,会使得视频卡顿率指标劣化严重。而且不少视频是播放不到末尾的,下载所有弹幕也会带来带宽资源的浪费,所以我们做了弹幕渐进式下载。也就是监听当前视频播放时间的回调,挑选出相应时间窗口内的弹幕再进行下载。
弹幕混音路数限制:在现实场景下,同时说话的人超过 5 个,就很难分辨出第六个人的声音,并且考虑到端上的性能问题,所以我们限制了同时混音的弹幕个数最多为 6 个。
弹幕解码线程池优化:混音模块会为每一个弹幕开启一个解码器和一个解码线程,相应的会带来 1M 以上的内存增长。在某些弹幕非常多的热门作品上,就会产生非常大的内存峰值。解码线程池的优化就是控制线程池中的线程数量最多为 10 个,最少 4 个。这样一来线程的开销下降了,解码器的并发实例数也少了,整体内存峰值就平稳了很多。
6.2 业务以及技术的扩展性
整个弹幕的技术架构采用了数据驱动的方式,底层弹幕混音模块拆分的也足够清晰,客户端很容易基于弹幕的这套技术框架,扩展出一些新功能新玩法。曾经我还做过一个视频弹幕的 Demo,大家可以看下视频录屏:
从上述录屏视频中可以看到三个视频弹幕与底版同时混音播放的场景,其实视频部分的编排也可以搞成四宫格甚至更多复杂的转场。
七、音乐弹幕总结与收益
7.1 总结
下面是我们音乐弹幕的大图:
![](https://static001.geekbang.org/infoq/e9/e97b610a8f621fc35533b26947f1a968.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
在上面的讲述中,我们详细介绍了音乐弹幕产品的核心功能,这个基础的产品功能是大图中第二行及以下的部分,基于这个基础的产品功能,产运团队又包装出了像弹幕库、神弹盲盒、一弹多发、接龙唱等一系列富有创意和趣味性的玩法。
7.2 收益
语音弹幕功能作为回森产品的独特亮点,成功地将消费、生产和社交融为一体,为用户带来了耳目一新的体验。这一创新不仅让用户在享受音乐的同时积极参与创作,更在创作过程中与作品作者及其他用户产生了深度互动,极大地提升了整个社区的氛围和活跃度。
八、用户故事分享
我们回森的技术人员在近 3 年的时间里和用户其实走的是很近的,中间也发生了很多有意思的事情,在最后再和大家分享两个小故事:
故事 1:弹幕前两秒音质差
音乐弹幕功能上线一段时间后,我们收到了一位年轻 iOS 用户的反馈,他表示自己演唱的弹幕前两个字音质较差,但后续部分音质则恢复正常。起初以为这可能是个别用户听觉感知的差异,并未给予过多关注。随后又有几位用户也提出了相同的问题,这引起了我们的高度重视。经过团队评估:对比用户演唱的弹幕文件频谱图与实际播放声音的频谱图,我们发现了问题所在:前 1.5 秒的高频部分确实存在缺失现象。挖掘问题根因,由于 iOS 平台使用的是硬件编码器进行弹幕编码,AAC 的 profile 选择了 HE-AAC。HE-AAC 之所以能实现更高的压缩比,是因为它考虑了高频与低频之间的冗余性。然而,在这种特定情况下,由于我们弹幕系统中的 seek 部分导致了前 1.5 秒高频部分的缺失,最终修复了这个 bug 整体音质就恢复了。
![](https://static001.geekbang.org/infoq/08/083661a1aecf29db0334a7c535194ef1.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
故事 2:弹幕前边能对齐,后边对不齐
另外一个问题是升级了 ffmpeg 5.0 之后,用户反馈唱了一条弹幕,前几秒是对齐的,但是后边就对不齐了,这次我就直接进行下 dump 进行查询,作品与弹幕播放的 dump 文件拖入到 Audacity 中如下图所示:
![](https://static001.geekbang.org/infoq/00/005883bc2e73413d14417b5c9d2977c4.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
明确了问题追后,也很快查到了具体原因,其实是升级了 ffmpeg 之后,在某些作品中 ffmpeg 解码出来的 AVPacket 的时间与时长是不对的,而这个问题在其他的音视频应用中并不存在,但是在我们弹幕场景下确实比较严重,因为我们的对齐程度差到 50ms 以上很多用户就会直接反馈问题了,最终解决问题的方法我就不在此展开了。
其实通过这两个小故事想跟大家分享的是,作为用户产品的研发人员,我们应该要充分的倾听用户的声音,和用户一块共同成长。
九、小结
在本文中,我们将首先探讨音乐弹幕分角色的核心行为。接着详细剖析了消费端和生产端的核心技术,揭示了回森在诸多细节上的极致追求。这些不仅是回森产研团队紧密合作所构建的壁垒,更是其持续创造创新玩法的坚实基石。随后,我们将目光转向音乐弹幕作品的分享机制,以及整体系统的性能与扩展性。在这两个环节中,我们可以看到研发团队的深思熟虑,他们不断权衡性能、成本和研发效率之间的平衡,以寻求最佳的解决方案。这是回森技术团队一直在做的事情,要善于在不同的阶段选择合适的技术架构支撑业务、赋能业务,与产研团队一起拿到最终的业务结果。
本文作者:展晓凯
如果您在阅读这篇文章后深感其价值,恳请您慷慨点赞。您的每一次认可和鼓励,都将成为我们不断前行的动力!
评论