录像功能是执法仪的核心功能.为满足执勤要求,长时间稳定摄录是关键.根基我个人几年的执法仪开发经验,总结出如下的设计指引,希望能对读者有所启发.如有不完善之处欢迎讨论.
录像模块架构如下:
整个架构分为两个进程,主进程和Muxer进程.
-
主进程
主进程就是数据采集和编码进程,从摄像头和mic采集到视音频数据,再通过MediaCodec编码器,分别编码成视频和音频媒体帧.
为了保证媒体帧流畅和逻辑简单,将这两个媒体做线程隔离,音频编码和视频编码分别运行在各自线程.
-
Muxer进程
Muxer进程的工作应保证最简化,这样才能最大程度保证视频文件的完整性.其工作就是写入视频帧到录像文件.
为了可控,我们没有使用安卓原生的MediaMuxer类来操作,而是选择编译ffmpeg库实现.
注:我们测试,安卓远程的MediaMuxer在一些设备上,即便整个录像过程一切顺利,也有可能产生无法播放的媒体文件,偶然性大,原因未知,不好排查.我们最终放弃了MediaMuxer,转而使用ffmpeg库来封装.
我们通过下面的系列问题和功能点加以详述.
文件完整性
MP4文件合流
(mux)需要遵循:
写入头(Header)
->持续写入媒体帧(Frame)
->写入尾(Tail)
的完整过程,只有该过程正常执行,文件才能播放.整个过程由唯一录像句柄串联,如果Mux中遇到异常,Mux过程中断,句柄丢失,录像文件会损坏,无法播放.
因此Mux过程非常重要,这就是分进程的目的.通过一个Muxer进程来单独执行mux过程,该进程逻