美文网首页音视频,多媒体,编解码
如何做到短视频录制同步?

如何做到短视频录制同步?

作者: 木木君被占用 | 来源:发表于2020-04-25 01:33 被阅读0次

    短视频录制基本流程

    短视频录制基本流程

    同步的重要性

    “BGM和人声对不齐”,“BGM和嘴型对不齐”等等,同步问题是用户最容易感受到的,也是一个深度短视频录制者非常看重的;同时,由于兼容性和产品功能的多样性,比如seek、跳过前奏、原唱伴唱切换等等,非常容易出现且难以察觉,甚至难以解决。下面我们就来分析,是什么导致不同步的问题,以及如何解决。

    问题分析

    我们常见的短视频录制的场景,以及要做的到的同步问题

    纯音频录制(音频K歌)

        主要是伴奏和人声的同步

    单视频录制(视频K歌、短视频录制)

        主要是伴奏和人声、录制视频同步,进一步分解为伴奏和人声的同步,和伴奏和视频的同步。

    多视频录制 (视频合唱、视频跟拍)

        主要是录制视频、跟拍视频、伴奏和人声同步,进一步分解为伴奏和人声的同步,伴奏和视频的同 步,和录制视频和跟拍视频的同步。

    因此我们将短视频录制的同步问题,分解为以下三个问题,并一一分析和解决。

    1、BGM和人声的同步

    2、BGM和视频的同步

    3、录制视频和跟拍视频的同步

    问题解决

    BGM和人声的同步

    同步非常难以解决的一个原因是很难直接量化,所以第一步我们要去量化它。

    我们使用每隔两秒滴一下的音频作为BGM,打开外放,这样滴的声音又会被重录进app中,这样BGM滴的声音的位置和重录进去滴一声的位置的差,就是不同步时间差,一般要求

    音视频实验室:-100ms ~ 100ms

    能够量化后,接着我们要做到的是以下两步:

    1)保证写到本地的BGM和人声数据量相同

    2)保证BGM和人声没有错位

    1、保证写到本地的BGM和人声数据量相同

    有两方面,一方面是保证帧数相同,另一方面要保证bgm和人声的pcm的采样率相同,为后续混音,seek,裁剪等处理做准备。

    保证帧数相同业界有两种方案:

    1)输入一帧(录入)人声,输出一帧(播放)BGM。实现的方式比如说IOS本身的AudioQueue和 Android类似的实现oboe,都是通过一个线程去保证输入一帧(录入)音频,输出一帧(播放)音频。

    2)Android系统实现中,录制器和解码器是维护在不同线程中的,如何在两个线程(录制线程、解码线程)中,保证BGM和人声数据量相同。我们在解码器中维护了一个queue,里面缓存了解码出来的音频帧。解码一帧音频,放入queue中一帧;录制出一帧音频,从queue中取出一帧音频。

    保证采样率相同,需要我们在BGM解码后和录制出数据后,增加重采样的步骤。

    2、录制的人声和BGM没有错位

    有以下原因会导致人声和BGM错位

    1)录音器的输入延迟和播放器的输出延迟

    人声的录入需要经过以下阶段:一段BGM先经过播放器播放,人听到并同步的唱出,经过录制器,回到app中。

    因此人声的时间点与对应的BGM的时间点,必然是落后录音器的输入延迟 + 播放器的输出延迟

    因此我们需要开始录制时裁减掉开始部分人声,同时在录制结束时,用空数据补全缺少的人声。

    2)解码速度如果低于录制速度,就会导致BGM播放卡顿以及堵塞录制线程。

    录制的输入速度由硬件层保证,一定是输出的数据量代表的录制间隔(所以有的时候可以直接根据绝对时间变化,计算录制pts)

    解码速度如何保证大于或者等于录制的输入速度呢?一方面及时是m4a的音频的解码速度一般也是快于20ms/帧的,另一方面更建议使用直接使用pcm。pcm可以是直接下载到或者在准备过程中预解码得到的。

    同时如果使用pcm的话,会使得seek变得更加精准且快,但同时带来交互上的成本或者下载成本。

    3)warmup 音频预热

    分input音频预热和output音频预热,难点在于app开发者无法直接获得,且不同设备差距很大。

    针对这种情况,有一种方案是在线下通过之前介绍测量环路延迟的方法,测量top机型的整个环路延迟,在录制过程中,根据测量的环路延迟,丢弃人声的音频帧。

    但是这种方案并不能覆盖所有机型,同时需要很大的成本去维护环路延迟机型表,所以我建议采取的手段可以是

    通过假暂停减少多次音频预热出现

    由于音频预热比较小,可以在对开始录制的地方,忽略音频预热

    4)seek不精准

    使用精准seek或者直接使用pcm数据

    5)解码器缓存和播放器缓存

    在重新开始录制时,要记得清楚解码器缓存和播放器缓存,避免解码器缓存和播放器缓存导致多余的BGM播放导致,录制时间滞后BGM播放时间

    事实上还有最后的兜底方案,也是业界内比较常用的,就是在预览页允许用户根据微调人声和

    最后,我们发现BGM和人声的同步校准,并不是采用根据时间戳去校准,反而是严格保证音频帧数据量一致且没有错位来校准,这是由于人耳对音频的敏感性,录制中不能有丢帧。

    BGM和视频的同步

    非常重要,但是也比较通用,大体有三个方案:

    三种方案比较

    由于对声音连续的要求高,所以基本不会考虑方案B。

    录制视频和跟拍视频的同步

    目前有两种方案:

    方案一:

    1、预览时,播放和录制相互不影响;左边播放原视频,右边播放camera返回的视频。

    2、合成时,根据pts分别从原视频和录制视频中,取出pts对应的视频帧,再合并在一起。

    方案二:

    1、预览时,从原视频按照录制的pts取对应的视频帧,和录制的视频帧,先一起绘制在一个framebuffer上,再展示在屏幕上和经过编码写到文件中。

    2、无合成过程。

    方案比较

    因此在短视频录制场景,建议优先使用方案二。

    相关文章

      网友评论

        本文标题:如何做到短视频录制同步?

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