zoukankan      html  css  js  c++  java
  • EasyDarwin云平台:EasyCamera开源摄像机接入海康威视摄像机PS流转ES流

    本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376

    海康威视使用PS流封装H.264流,EasyDarwin云平台支持ES流。当我们需要接入海康的视频时,我们就需要将海康的PS流转换为ES流。
    首先,我们要知道什么PS流,ES流。

    ES流(Elementary Stream): 也叫基本码流,包含视频、音频或数据的连续码流。

    PS流(Packet Elementary Stream): 也叫打包的基本码流, 是将基本的码流ES流根据需要分成长度不等的数据包, 并加上包头就形成了打包的基本码流PS流。

    TS流(Transport Stream): 也叫传输流, 是由固定长度为188字节的包组成, 含有独立时基的一个或多个program, 一个program又可以包含多个视频、音频、和文字信息的ES流; 每个ES流会有不同的PID标示. 而又为了可以分析这些ES流, TS有一些固定的PID用来间隔发送program和ES流信息的表格: PAT和PMT表。

    关于PS流的格式解析,大家可以参照 PS流的格式和解析总结

    那我们如何将PS流转换为ES流呢?(这里要感谢EasyDarwin团队的Sword)

    bool GetH246FromPS(IN BYTE* pBuffer, IN int nBufLenth, BYTE** pH264, int& nH264Lenth, BOOL& bVideo)
    {
        if (!pBuffer || nBufLenth <= 0)
        {
            return FALSE;
        }
    
        BYTE* pH264Buffer = NULL;
        int nHerderLen = 0;
    
        if (pBuffer
            && pBuffer[0] == 0x00
            && pBuffer[1] == 0x00
            && pBuffer[2] == 0x01
            && pBuffer[3] == 0xE0)//E==视频数据(此处E0标识为视频)
        {
            bVideo = TRUE;
            nHerderLen = 9 + (int)pBuffer[8];//9个为固定的数据包头长度,pBuffer[8]为填充头部分的长度
            pH264Buffer = pBuffer + nHerderLen;
            if (*pH264 == NULL)
            {
                *pH264 = new BYTE[nBufLenth];
            }
            if (*pH264&&pH264Buffer && (nBufLenth - nHerderLen)>0)
            {
                memcpy(*pH264, pH264Buffer, (nBufLenth - nHerderLen));
            }
            nH264Lenth = nBufLenth - nHerderLen;
    
            return TRUE;
        }
        else if (pBuffer
            && pBuffer[0] == 0x00
            && pBuffer[1] == 0x00
            && pBuffer[2] == 0x01
            && pBuffer[3] == 0xC0) //C==音频数据?
        {
            *pH264 = NULL;
            nH264Lenth = 0;
            bVideo = FALSE;
        }
        else if (pBuffer
            && pBuffer[0] == 0x00
            && pBuffer[1] == 0x00
            && pBuffer[2] == 0x01
            && pBuffer[3] == 0xBA)//视频流数据包 包头
        {
            bVideo = TRUE;
            *pH264 = NULL;
            nH264Lenth = 0;
            return FALSE;
        }
        return FALSE;
    }

    源码及视频教程

    源码地址: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

  • 相关阅读:
    关于ArcGIS Server VS2010无法显示发布的地图服务
    NDK,动态链接库,JNI
    android开发中一些报错的解决方法
    查询死锁对象
    pb导入excel文件
    n_cst_ping在powerbuilder 11 中的变化,一面的程序可正常ping
    SQL拼音
    数据库优化
    android调用asp.net webservice,返回json结构
    iframe内部需要弹出浮层问题
  • 原文地址:https://www.cnblogs.com/babosa/p/9217882.html
Copyright © 2011-2022 走看看