zoukankan      html  css  js  c++  java
  • DVR项目过程中出现的一些问题及解决

    1)丢帧

    表现:录制音视频同时将其合成avi,存放于nfs文件系统(在虚拟机上)时,会发生丢帧现象。录取10分钟的视频,你可能得到的是有925秒的avi,观看录像会发现某些地方会突然播放速度加快,出现的几率是比较随机的,几秒以后恢复正常。

    分析:要录取10分钟的视频却得到9分多钟的视频,而且avi文件播放过程中有快进的现象,中间应该是丢失了某些帧,这些帧包括视频帧和音频帧。由于avi是边合成边存储的,而文件系统是通过网线与dm355相连的,网路的稳定性可能会影响avi数据的传输。

    解决:插上SD卡,将avi视频存放到SD卡中,避免了通过网络传输数据的流的过程,经实验检验,丢帧现象消失。

     

    2)cpu使用率达到100%

    表现:录制avi过程中cpu一直处于100%的水平

    分析:线程过多,打开的写入文件过多,程序录制avi的同时,生成mpeg4文件、g711文件、index文件,这里每个文件都涉及到写入操作,占用的cpu资源较多。

    解决:只生成avi文件,把不必要的生成mpeg4g711功能去掉。

     

    3)录制的视频会偶然有噪音。

    以下是有噪音时的方案采取的方法:

    我们采用一帧视频一段音频的交叉方式,因为视频的帧率是30/s,我们音频的采样频率为8000HZ,因此每段音频的采样长度为8000/30=266.6,我们取266

    由于266.6266并不完全相等,当录制时间较长时将会出现音视频不同步的问题,我们采用动态调整音视频交叉频率的方法。具体方法是使用一个变量deltaTime=266.66666-266,存放每一帧视频对应一段音频的时间偏移量;一个变量timeDelay存放时间偏移累积量,当时间偏移累积量的值大于265时,我们清空一次,timeDelay=timeDelay-265,同时停止写入视频一次。以下是伪代码:

    double timeDelay=0;    //用于记录视频和音频时间误差

    double deltaTime=8000/30.0-266;//因为我们每帧视频对应次采样的音频,每次视频落后音频-266.6666

    if(timeDelay < 265)   //假如误差已经积累到超过一帧视频对应一段音频的大小,我们将跳过这次音频的写入

    {

    video管道获取视频帧,并写入avi文件;

    timeDelay+= deltaTime;

    }

    else                  //误差清零

    {

         timeDelay= timeDelay-265;

    }

    speech管道获取音频段,写入avi文件;

        分析:一段音频一段视频的音频频率刚好是最难适应的,因为这样的交叉频率进程的切换是最频繁的,而且缓存是最容易出问题的。

    例如我们用一帧视频,3段音频的频率交叉,每段音频大小大约是80(这也是板载程序用的大小),我们会发现,假如由于时间过短导致缓冲问题从而导致取得的音频数据有偏差的话,那么受影响的将会是第三段音频,也就是它能保证前两段是完好的;这种交叉方式录取三帧视频需要切换线程6次。

    假如是一段视频一段音频,由于缓存冲突问题将会导致整一段音频有偏差;录取三帧视频线程切换的次数是6

    假如是三帧视频一段音频,由于三帧视频才有一段音频,所以有足够时间,那么由于缓存出现问题导致音频有噪音的概率将会小很多;录取三帧视频线程切换的次数是2

    综合比较,我们采用三帧视频一段音频的方法。另外,由于三帧视频刚好对应800次采样,是整数,处理起来简单很多。

     

        解决:变为3帧视频一段音频。

  • 相关阅读:
    03-java实现双向链表
    04-java实现循环链表
    02-java实现单链表
    01-java实现动态数组
    安装mpi的那些坑
    gotoblas,mpich,hpl,hpcg的安装
    centos之hadoop的安装
    公告
    AFO之后……
    Codeforces Round #599 (Div. 2)的简单题题解
  • 原文地址:https://www.cnblogs.com/ManMonth/p/1734514.html
Copyright © 2011-2022 走看看