曾经做过一个关于摄像头视频方面的项目.在这个项目中遇到了两个麻烦的问题,特记录下来.
视频的流畅性问题:
首先说下我的结构:
主要分三部分: 上层: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以上才不延时.这个特别记录下.