音视频,多媒体,编解码

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

2020-04-25  本文已影响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、无合成过程。

方案比较

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

上一篇下一篇

猜你喜欢

热点阅读