短视频录制基本流程
短视频录制基本流程
同步的重要性
“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、无合成过程。
方案比较因此在短视频录制场景,建议优先使用方案二。
网友评论