音视频同步是咱们观看视频的一个根本体会,特别关于视频画面中能看到声源动作(如:嘴型)的场景,音视频同步问题十分影响体会。
在短视频与直播APP中,收集端作为音视频的生产者,假如收集端发生的音视频源自身就无法确保同步,那么后边不论经过什么处理,都很难再让用户看到音视频同步的画面了,因而,在收集端确保音视频同步上特别重要。
那么怎么确保app在各种正常/非正常状况下尽量确保输出同步的音视频?本文便是叙述咱们是怎么处理上述问题的。
音视频同步的原理
音视频收集的数据别离来自于麦克风与摄像头,而摄像头与麦克风其实是两个独立的硬件,而音视频同步的原理是信任摄像头与麦克风收集数据是实时的,并在收集到数据时给他们一个时刻戳来标明数据所属的时刻,而编码封装模块只需不改动音视频时刻的相对联系就能确保音频与视频在时刻上的对应。如此封装好数据之后,播映端就能够依据音视频的时刻戳来播映对应的音视频,从完成音视频同步的作用。
时刻戳参阅规范
取格林威治时刻做为比照规范,即音视频时刻戳都为收集时刻点相关于格林威治规范时刻的时刻差;
取体系开机时刻做为比照规范,即音视频时刻戳都是收集时刻点相关于手机开机时刻的时刻差。现在iOS上AVCaptureSession这套API便是参阅这个时刻规范给的时刻戳。
其它时刻戳规范
依据“开源项目1”的音视频同步讨论
原生某开源结构
如图:
简介
音/视频被收集到之后会先经过音/视频处理模块,音/视频在被处理之后才进入核算时刻戳的模块。
在榜首帧抵达时记一个计时起点,然后依据收集的帧距离对接下来每一帧的时刻戳进行核算:frameTimeStamp = lastFrameTimeStamp + frameDuration。
长处
能输出frame duration安稳的音视频时刻戳。
危险
无论是音频仍是视频,在手机过热、功能缺乏等极点状况下有或许呈现收集不安稳的状况,比如说估计1s收集30帧,实践只收集到28帧,而音视频的时刻戳是经过累加来核算的,这样就有会呈现音视频不同步的状况。
Video Process(人脸检测、滤镜、3D贴纸)有或许无法在一帧时刻内处理完当时帧,这样就会呈现帧数比预期低的状况,然后呈现音视频不同步。
帧距离涉及到无限小数时,由于核算机的精度有限会引发的时刻戳偏移,此偏移会跟着帧数的添加而逐步被扩大。
依据开源项目1的改善计划1
如图:
时刻戳的获取办法十分直接——每一帧都在改帧进入时刻戳核算模块时获取当时体系时刻作为时刻戳。
长处
APP功能正常的状况下必定不会呈现音视频不同步;
能够实时纠正时刻戳,只需APP正常工作,就能当即康复正确的时刻戳。
危险
依靠Video Process与Audio Process模块处理时长附近,而实践工程中由于人脸检测、贴纸等原因,Video Process或许会呈现堵塞的状况,然后导致临时性的音视频不同步
在Audio Process与Video Process模块处理帧耗时不均匀的状况下会呈现音视频时刻戳不均匀的问题,能否正常播映依靠于终端
依据开源项目1的一个改善计划2
如图:
简介
音/视频被收集到之后,先获取收集模块供给的音视频时刻戳,然后在音/视频处理模块透传收集模块获取到的音/视频时刻戳,在时刻戳核算模块持续透传收集模块给的时刻戳。
长处
除非收集模块给出过错数据,不然音视频都一定是同步的。
危险
或许会呈现音视频时刻戳不均匀的状况,特别是在手机过热、功能缺乏等极点状况下。
直播方向更进一步的优化讨论
大致流程如图:
简介
音/视频被收集到之后,先获取收集模块供给的音视频时刻戳,然后在音/视频处理模块透传收集模块获取到的音/视频时刻戳。
在时刻戳核算模块透传视频时刻戳,并依据下文中说到的办法核算音频时刻戳。
音频时刻戳核算办法
实时核算时刻戳:当时时刻戳=开始时刻戳+帧数*帧采样数/采样率;
假如时刻戳偏移量超出阈值,纠正时刻戳;
纠正频率到达超出阈值,直接透传收集时刻戳。
长处
能够供给一个安稳的音频时刻戳,能够兼容帧距离小幅颤动形成的音频时刻戳不均匀;
兼容功能缺乏时导致实践收集帧数低于帧率。
危险
纠正时刻戳时或许会形成声响卡顿的感觉。
总结
详细计划最好是针对实践使用场景有选择性的做优化,比如说,在能够操控播映器战略的状况,能够考虑依据自研播映器特性做时刻戳处理。而假如播映器不可控,则尽量经过战略保证帧距离安稳。