EasyCamera海康摄像机向EasyDarwin云平台推送音视频数据的缓存设计
本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376
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)
获取更多信息
Copyright © EasyDarwin.org 2012-2016

EasyCamera海康摄像机向EasyDarwin云平台推送音视频数据的缓存设计的更多相关文章
- 网络摄像机IPCamera RTSP直播播放网络/权限/音视频数据/花屏问题检测与分析助手EasyRTSPClient
前言 最近在项目中遇到一个奇怪的问题,同样的SDK调用,访问海康摄像机的RTSP流,发保活OPTIONS命令保活,一个正常,而另一个一发就会被IPC断开,先看现场截图: 图1:发OPTIONS,摄像机 ...
- 基于EasyDarwin云平台实现的EasyClient客户端与EasyCamera摄像机之间的对讲与云台控制功能
本文转自EasyDarwin团队Kim的博客,感谢Kim长期对EasyDarwin开源项目的贡献:http://blog.csdn.net/jinlong0603 EasyDarwin云平台是一套由E ...
- EasyDarwin云平台:EasyCamera开源摄像机接入海康威视摄像机PS流转ES流
本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376 海康威视使用PS流封装H.264流,EasyDarwin云平台支持ES流.当我们 ...
- EasyRTMP结合海康HCNetSDK获取海康摄像机H.264实时流并转化成为RTMP直播推流(附源码)
最近一家深耕于南方电网的科技公司同事找到我们,咨询关于调用海康HCNetSDK取流,并进行互联网转化的方案,经过反复的沟通以及自身在EasyDSS和EasyNVR方面的经验,我们推荐了海康HCNetS ...
- [工具]利用EasyRTSPClient工具检查摄像机RTSP流不能播放原因以及排查音视频数据无法播放问题
出现问题 我们在做流媒体开发的过程中,进程会出现摄像机RTSP流莫名其妙无法播放的问题,而我们常用的vlc经常是直接弹出一个无法播放的提示框就完事了,没有说明出错的原因,或者在vlc的消息里面能看到日 ...
- 解决.NET Core中MailKit无法使用阿里云邮件推送服务的问题
在博问中(.net core怎么实现邮件发送)知道了MailKit无法使用阿里云邮件推送服务发送邮件的问题,自已实测也遇到同样的问题,而用自己搭建的邮件服务器没这个问题. 于是,向阿里云提交了工单.. ...
- Laravel 下结合阿里云邮件推送服务
最近在学习laravel做项目开发,遇到注册用户推送邮件的问题,之前用java做的时候是自己代码写的,也就是用ECS推送邮件,但是现在转php的laravel了就打算用php的邮件发送功能来推送邮件, ...
- 用ASP.NET Core 1.0中实现邮件发送功能-阿里云邮件推送篇
在上篇中用MailKit实现了Asp.net core 邮件发送功能,但一直未解决阿里云邮件推送问题,提交工单一开始的回复不尽如人意,比如您的网络问题,您的用户名密码不正确等,但继续沟通下阿里云客户还 ...
- wordpress使用阿里云邮件推送服务实现发送邮件
之前用腾迅云时,配置了wordpress是可以使用邮件服务的,然而到了阿里云,却无法使用了,有人说是因为阿里云关了25端口,但腾迅好像也关了. 百度看看有没有其他方法,最终让我找到个方法,可惜不是很完 ...
随机推荐
- 【BZOJ1018】堵塞的交通traffic(线段树,网格图,连通性)
题意:一个2行C列的矩形网格图,网格上的每个点代表一个城市,相邻的城市之间有一条道路 一开始每条道路都是堵塞的,堵塞即为不可经过.经过一些操作后,可能某些道路通畅了,也可能某些道路堵塞了 多次询问,询 ...
- 古代猪文 BZOJ 1951
古代猪文 [问题描述] “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...
- 用jquery写的图片懒加载
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 【kindeditor】kindeditor的使用
官网:http://kindeditor.net/demo.php 效果:
- 快充 IC BQ25896 的 Dynamic Power Management
Spec 更正: 上面紅色框框應該還要再增加一個 ILIM pin 硬體所設定的 input current limit, 也就是說 input current limit 最多可以從這 3 個 IL ...
- PL/SQL Developer工具包和InstantClient连接Oracle 11g数据库
一.前言 PLSQL Developer是Oracle数据库开发工具,很牛也很好用,PLSQL Developer功能很强大,可以做为集成调试器,有SQL窗口,命令窗口,对象浏览器和性能优化等功能. ...
- js-百度地图多个标注点
以成都华誉口腔3个门诊部为例,锦江区-青羊区-高新区 html: <div class = "demo_main"> <fieldset class = &quo ...
- inotify+rsync的初步配置
inotify的简单配置 Linux内核从2.6.13开始,引入了inotify机制.通过intofity机制,能够对文件系统的变化进行监控,如对文件进行创建.删除.修改等操作,可以及时通知应用程序 ...
- Java NIO中的Buffer类
Buffer 缓冲,用于批量读写数据 Buffer是一个抽象类,基本数据类型都有实现类:XxxBuffer,比如ByteBuffer.CharBuffer.IntBuffer.DoubleBu ...
- Ubuntu 16.04下安装WineHQ
说明: 1.Wine和WIneHQ没什么区别,新版和旧版的问题. 2.安装了深度的Wine包也可以和WineHQ一起兼容,因为深度的应用名已经加了deepin前缀,所以不冲突. 3.安装了Wine之后 ...