zoukankan      html  css  js  c++  java
  • 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 
    ", 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.org

    WEB:www.EasyDarwin.org

    Copyright © EasyDarwin.org 2012-2016

    EasyDarwin

  • 相关阅读:
    js表单提交回调函数
    sublime text3下BracketHighlighter的配置方法
    不同版本的jquery的复选框checkbox的相关问题
    jquery键盘常见事件
    jQuery学习笔记(一)
    sublime text按esc经常进入command mode(不能输入任何东西)
    sublime text光标移入移出括号的快捷键设置
    sublime text3 自己定义的不同浏览器的预览快捷键
    grains和pillar的联合使用
    自定义模块和grains
  • 原文地址:https://www.cnblogs.com/babosa/p/9217881.html
Copyright © 2011-2022 走看看