基于android系统DVR稳定性问题分析及对策

基于android系统DVR稳定性问题分析及对策

        DVR,全名Digital Video Recorder,数字视频录像机,在车载行业大家通俗的叫行车记录仪,因为这个数字视频的内容是行车的形式动态。如今,在道德滑坡的社会不良风气的影响下,出现了诸多的碰瓷党,因此行车记录仪就成了车主的保护神,有了视频录像作为证据,交警来了自己心里都更有底气。但是如何把这个功能做得稳定可靠呢?

       很多人可能会想,不就一个录像嘛,还能出多大异常啊!这个功能不难啊!哈哈!当然,不难的是搞出一个有这个功能的产品,难的是搞出一个有这个功能高稳定性、高可靠性的产品,产品的价值也就体现在这上面。首先,录像大家都追求一个视频分辨率,分辨率越高理论上需要存储的数据就越多,码率越高存储的数据量也越多;另外图像的质量好坏也是一个直接的竞争力,行车路况、天气情况每天每时都不大一样,在明亮的环境下,在阴暗的桥洞下,在有灯的隧道,无灯的隧道,有树荫的地方,以及蓝天白云的空旷地,白天很夜晚,场景很多,每种场景要有一个好效果,那必须多每个这种场景去做一个适配调节,并且还需要能够快速反应自适应,有HDR宽动态的只是一个具备这种能力,要调出效果还需要很多汗水跟毅力。扯远了点,DVR是存在哪里的呢?从目前整个行业的普遍做法还是存在TF卡里面,也就是通常叫的SD卡,这种卡易拔插,携带方便,替换也方便,卡的品质等级也有很多种,比如C2,C4,C6,C10,还有U1,U3等,等级越高读写速度越好,价格也越高。卡的性能也会影响DVR功能的稳定性,至关重要!

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

       首先,我们从源头的数据量来考虑。我们的理想是,图像非常清晰,质量高,录像出来的文件都像美国大片那样细腻。但是现实是做不到的,主要产业链的瓶颈还是在存储上跟编码的效率上。编解码目前主流的还是H.264的,支持H.265的并不多,那么我们就以H.264来讲,图像编码的质量越高需要的码率也就越高,单位时间内需要存储的编码后的视频数据量就越大。目前纯行车记录仪的产品,比如小米的、360的他们支持前视录像的,码率都达到了10Mb/s以上,1080P的,每分钟存储量达到100M以上,理论上C4及以上的SD卡就能满足了,但是SD卡的品质参差不齐,还有很多造假的,杂牌厂贴牌的,比如C4的卡刚开始使用,可能可以达到3M以上的读写速度,但是卡用一个月后,性能急剧下降,可能就不到2M了,越往后就越慢,因此基本上都是配的C10的卡,考虑性能效率下降,在3个月内还能扛得住。SD卡作为一个易耗品,本来也是要经常更换的,一般3~6个月更换一次比较好。在做同时录前视加上后视的产品上,因为存在前后两路视频数据需要存储,这对存储卡的操作就更频繁了。考虑到两个不同线程对同一张卡的操作效率的考虑,两路码率跟一路同样码率大小的产品对比,两路明显需要更多一点的写入时间。很明显的就是,我们在电脑上给U盘拷贝两个东西,我们一个一个拷的速度比两个同时拷的速度还快一点,就是不需要两个互斥同步的时间消耗,另外也是一个批量写入跟两个零散写入的差别。因此,建议在图像足够清晰的情况下,码率尽量低一点,减少视频数据的存储量,选用C10及以上的卡。

       刚刚我们已经了解了视频数据源跟写入存储器的一些基本知识,那我们就再从系统的角度来看视频数据的共用。我们知道,行车记录仪的图像可以预览,也可以不预览,但是录像功能在后台都是可以工作的。从效率上考虑,目前预览跟录像使用的视频数据都是同一个buffer的,属于共享的。如果有阻塞会造成行车记录应用出现黑屏的问题,就是预览或者录像未及时释放buffer,造成底层camera驱动没有buffer接收新的视频数据,造成这种堵塞后就预览也预览不了,黑屏满满的,另外录像也不可能正常了。因此,我们需要监控这个视频数据buffer的空闲情况,比如有10个buffer,如果当有8个被占用了,那我们就需要加快消耗的速度,但是加快消耗的速度不大好控制,一般还是控制输入的速度,比如预览的图像我不送那么快了,处理不过来了就不连续送那么多,比如没两帧送一帧,如果还没有效果到更严重时,就要考虑少喂一点视频数据帧给编码器了,这是万不得已的情况了,整个功能异常总比视频数据丢掉一些帧要更糟糕吧,丢也不能丢太多了,比如25帧的,你丟个3~5帧也顶多了,太多了就没意义了。实在不行,我们在buffer即将满的情况下,通知一个消息给DVR应用,暂停一下录像,这个我在前面的文章中也提到过。

      另外,在写入数据的地方也是有很多门道的。两路数据的写入尽量隔开一点时间,一般采用固定码率的产品还比较多,这样两路的编码数据写入理论上是有周期的,在这种周期相撞的情况下,软件上控制一下后来的那一个任务稍微延后执行一下,尽量错开,这样SD卡的工作效率也更高一点。笔者在前面的文章中有专门介绍过具体的处理方法。另外还有编码堵塞其实也是可能监测的,如果堵塞了可以想办法发送消息给应用去处理,比如降低码率来降低符和。

      当前面的常规方法都还拯救不了DVR的情况下,可以考虑临时性的杀一下mediaserver进程,此方法很有效,也有弊端,极端的情况下这种方法也救不回来,不过这种方法出异常时90%的情况下还是可行的。

      除此之外,我们还需要监控一下SD卡的品质,比如是什么样的等级的卡,如果等级低了,我们提醒用户去换更换的卡,减少一些非法拔插SD卡的动作,要警示用户可能导致功能异常。目前在存储上,使用预分配的方法可以获得更好的SD读写性能,相等于分好了一块一块的,这样会减少多次分配的碎片问题,这样效率会高很多。

      很多产品只有这个功能的,弄稳定还相对容易一些,在一些功能比较多的产品上做行车记录的功能,要做稳定需要更大的精力跟耐力。系统CPU也是多个任务在共用,CPU轮转不及时就可能堵塞造成功能异常,功能越多越复杂,留给DVR的操作余量要越大。多考虑一下异常情况下怎么做,各个条件都好的情况下,一般的工程师都能做出好产品。很多时候,我们没有那么足够的资源下去干一些相对多的事情,当然需要想更多的办法!

     做车载产品不容易,做好车载产品更不容易,前行去珍惜,做好了大家还有口饭吃!加油!

 

 

猜你喜欢

转载自blog.csdn.net/sundesheng125/article/details/80207560