摄像头视频流畅性和延时问题的处理

来源:互联网 发布:北京招聘淘宝摄影 编辑:程序博客网 时间:2024/05/22 13:53

曾经做过一个关于摄像头视频方面的项目.在这个项目中遇到了两个麻烦的问题,特记录下来.

视频的流畅性问题:

 首先说下我的结构:

 主要分三部分: 上层:ffmpeg解码+UI渲染

                         中层:循环buffer缓存视频数据(单独的一个线程)

                         底层:视频数据接收(单独的一个线程)

对于这个流畅性问题,

       首先优化了底层的usleep时间,有之前的40x1000 调整到5*1000. 使接收数据尽可能快些(当然这里有对I帧, P,B帧的处理).

      然后优化了中间层的线程休眠时间.

    调整后的代码如下:

 while(1 == pVideo->recviceing) {

        if (0 == pVideo->recviceing || NULL == pPopVideoBuf) {

           //退出线程

            break;

        }

        //int len 从循环buffer里面取数据

        if(len <= 0){

            usleep(1*1000);

            continue;

        }

         //上报给上层

         usleep(5*1000);

    }

       在开始的时候,我设置上报上层的休眠时间设置为300*1000; 这里为什么是5*1000,这要取决于上,中,下三层的时间关系,我是调试这个时间出来的.这里还的特别说明len <= 0 情况下usleep时间,我开始设置了1000*1000,结果视频每个一段时间就顿一下.最终原因是这个原因.设置1*1000才不卡顿.

 上层:更新了最新的ffmpeg并支持x264.

通过这几个时间设置和更新ffmpeg2.8.3后,视频就流畅起来了. 至于为什么低层是5*1000, 中层5*1000这个时间就不知道原因了.

延时处理:

 其实还是ffmpeg的参数设置.正确设置如下:

在初始化函数中

pCodecCtx->time_base.den = 1;

pCodecCtx->time_base.num = 75;

//

av_opt_set(pCodecCtx->priv_data, "preset", "superfast", 0);

av_opt_set(pCodecCtx->priv_data, "tune", "zerolatency", 0);  //


默认情况下 time_base.den = 1;time_base.num = 25,网上也是这样的.

但是无意间我调整到num=75就不延时了.一切都好起来了.  网上num参数都是25.但在这个项目中是要设置为60以上才不延时.这个特别记录下.



0 0
原创粉丝点击