EasyCamera海康摄像机向EasyDarwin云平台推送音视频数据的缓存设计
2016-10-08 14:13
330 查看
本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376
EasyCamera在向EasyDarwin云平台推送音视频数据时,有时一个I帧会很大,从摄像机SDK中获取的数据就会被拆分。我们使用EasyPusher向云平台推送时需要每次发送一整帧数据,这时我们就需要设计一个缓存机制将SDK拆分的帧组成一个完整的帧数据,再使用EasyPusher推送给EasyDarwin云平台。这里以海康威视摄像机SDK获取的数据为例。
这里我们可以看到图片的第三行到第十行是一帧数据。由于数据过大,SDK将其拆分为8个包。我们就需要将这8个数据包组合正一个完整的关键帧推送给云平台。
当我们获取第一个数据包的时候我们判断数据包是否为0x00、0x00、0x00、0x01开头,则表示这是一个I帧或P帧,判断pos是否为0,若为0,则将数据放入buffer,若不是,说明buffer中已经存在一个完整的I帧或者P帧数据,则发送;
若获取到的数据开头不为0x00、0x00、0x00、0x01,则判断pos是否为0,若是,则丢弃,若不是,则说明这个数据为拆分的数据,需要加入buffer。
视频教程地址:[http://edu.csdn.net/course/detail/3029
](http://edu.csdn.net/course/detail/3029)
WEB:www.EasyDarwin.org
Copyright © EasyDarwin.org 2012-2016
EasyCamera在向EasyDarwin云平台推送音视频数据时,有时一个I帧会很大,从摄像机SDK中获取的数据就会被拆分。我们使用EasyPusher向云平台推送时需要每次发送一整帧数据,这时我们就需要设计一个缓存机制将SDK拆分的帧组成一个完整的帧数据,再使用EasyPusher推送给EasyDarwin云平台。这里以海康威视摄像机SDK获取的数据为例。
数据分析
我们先看一下摄像机SDK获取的帧数据这里我们可以看到图片的第三行到第十行是一帧数据。由于数据过大,SDK将其拆分为8个包。我们就需要将这8个数据包组合正一个完整的关键帧推送给云平台。
设计思路
我们建立一个固定大小的缓存区buffer,和一个用于标记偏移的pos并初始化为0;当我们获取第一个数据包的时候我们判断数据包是否为0x00、0x00、0x00、0x01开头,则表示这是一个I帧或P帧,判断pos是否为0,若为0,则将数据放入buffer,若不是,说明buffer中已经存在一个完整的I帧或者P帧数据,则发送;
若获取到的数据开头不为0x00、0x00、0x00、0x01,则判断pos是否为0,若是,则丢弃,若不是,则说明这个数据为拆分的数据,需要加入buffer。
代码
if (h264Buf[0] == 0 && h264Buf[1] == 0 && h264Buf[2] == 0 && h264Buf[3] == 1) { if (fPusherBuffOffset > 0) { EASY_AV_Frame avFrameVideo; memset(&avFrameVideo, 0x00, sizeof(EASY_AV_Frame)); avFrameVideo.u32AVFrameLen = fPusherBuffOffset; avFrameVideo.pBuffer = (unsigned char*)fPusherBuff; bool isKeyFrame = IsIFrame(fPusherBuff); avFrameVideo.u32VFrameType = isKeyFrame ? EASY_SDK_VIDEO_FRAME_I : EASY_SDK_VIDEO_FRAME_P; avFrameVideo.u32AVFrameFlag = EASY_SDK_VIDEO_FRAME_FLAG; //avFrameVideo.u32TimestampSec = pstruAV->u32AVFramePTS / 1000; //avFrameVideo.u32TimestampUsec = (pstruAV->u32AVFramePTS % 1000) * 1000; Easy_U32 ret = EasyPusher_PushFrame(fPusherHandle, &avFrameVideo); //printf("-- Pushing: Frame %s Result %d \n", isKeyFrame ? "I" : "P", ret); fPusherBuffOffset = 0; } memcpy(fPusherBuff, h264Buf, h264Len); fPusherBuffOffset += h264Len; } else { if (fPusherBuffOffset > 0) { memcpy(fPusherBuff + fPusherBuffOffset, h264Buf, h264Len); fPusherBuffOffset += h264Len; } }
源码及视频教程
源码地址:https://github.com/EasyDarwin/EasyDarwin/tree/master/EasyCamera-HK视频教程地址:[http://edu.csdn.net/course/detail/3029
](http://edu.csdn.net/course/detail/3029)
获取更多信息
邮件:support@easydarwin.orgWEB:www.EasyDarwin.org
Copyright © EasyDarwin.org 2012-2016
相关文章推荐
- EasyCamera海康摄像机向EasyDarwin云平台推送音视频数据的缓存设计
- EasyCamera向EasyDarwin云平台推送音视频数据的缓存设计
- EasyDarwin开源云平台接入海康威视EasyCamera摄像机之快照获取与上传
- EasyDarwin开源云平台接入海康威视EasyCamera摄像机之快照获取与上传
- EasyDarwin在做拉模式转发海康RTSP摄像机视频流的过程中出现花屏问题的解决方案
- EasyDarwin在做拉模式转发海康RTSP摄像机视频流的过程中出现花屏问题的解决方案
- 基于ArcEngine+C#实现的JLKDataManager空间数据平台架构设计
- 实时数据缓存管理的初步设计
- 网络教学资源平台设计与实现--公告发布系统数据表
- 校园数字化建设--注册中心投标文件研究(6)--公共数据交换平台设计方案概述
- 产品设计:Android应用-开发技术【数据缓存】
- 基于ArcEngine+C#开发的空间数据管理平台架构设计及功能说明
- 实时数据缓存管理的初步设计
- 基于开源BI平台Openi的数据仓库系统的设计开发
- 游戏服务器数据缓存和持久化中间件设计总结
- osecvs 视频会议系统设计(一):白板数据传输
- 【LeanEAP.NET】精益企业应用平台设计----数据访问类库EAP.Data
- 周报——网络资源教学平台设计之课程管理系统E-R图及数据表
- 控件中国网:WebGrid.NET Enterprise®,一个为ASP.NET平台下WEB开发而设计的高级数据表格控件。(最新版本发布)
- 企业信息开发平台(3)数据表设计