云端NVR

  • 使用文档

    最近更新时间:2019-04-10 13:39:49

    TS封装和上传模块 使用说明

    初始化及销毁

    • 在创建TS封装和上传实例前需要初始化SDK资源 LinkInit
    • 在销毁TS封装和上传实例后需要销毁SDK资源 LinkCleanup

    创建和销毁 TS封装和上传实例

    • 创建一个TS封装和上传实例 LinkNewUploader
    • 销毁一个TS封装和上传实例 LinkFreeUploader

    推送音视频数据

    • 推送音频数据 LinkPushAudio
    • 推送视频数据 LinkPushVideo

    生成视频片段

    • 开始一个视频片段 LinkSetTsType
    • 结束一个视频片段 LinkClearTsType

    设置TS文件本地保存

    • 设置TS文件保存回调 LinkUploaderSetTsOutputCallback

    附录1:TS封装和上传模块 主要数据结构定义

    • 视频格式类型
    /** @brief 视频格式 */
    typedef enum {
            LINK_VIDEO_NONE = 0,    /**< 无视频 */
            LINK_VIDEO_H264 = 1,    /**< H264格式 */
            LINK_VIDEO_H265 = 2     /**< H265格式 */
    }LinkVideoFormat;
    
    • 音频格式类型
    /** @brief 音频格式 */
    typedef enum {
            LINK_AUDIO_NONE = 0,    /**< 无音频 */
            LINK_AUDIO_PCMU = 1,    /**< G711U格式 */
            LINK_AUDIO_PCMA = 2,    /**< G711A格式 */
            LINK_AUDIO_AAC =  3     /**< AAC格式 */
    }LinkAudioFormat;
    
    • 视频片段参数
    
    typedef struct _LinkSessionMeta{
            const char **keys;
            int *keylens;
            const char **values;
            int *valuelens;
            int len;
            int isOneShot;
    }LinkSessionMeta;
    
    
    • 封装和上传实例参数
    /** @brief 上传参数 */
    typedef struct _LinkUploadArg {
            LinkAudioFormat nAudioFormat;           /**< 音频格式 */
            size_t nChannels;                       /**< 音频通道数 */
            size_t nSampleRate;                     /**< 音频采样率 */
            LinkVideoFormat nVideoFormat;           /**< 视频格式 */
    
            const char * pConfigRequestUrl;         /**< 获取业务配置的请求地址 */
            size_t nConfigRequestUrlLen;            /**< 业务配置的请求地址长度 */
            const char *pDeviceAk;                  /**< 设备 APP KEY */
            size_t nDeviceAkLen;                    /**< 设备 APP KEY 长度 */
            const char *pDeviceSk;                  /**< 设备 SECRET KEY */
            size_t nDeviceSkLen;                    /**< 设备 SECRET KEY 长度 */
            void(*getPictureCallback)(void *pUserData, const char *pFilename, int nFilenameLen);
            void *pGetPictureCallbackUserData;      /**< 图片上传回调函数 */
            UploadStatisticCallback *pUpStatCb;     /*上传结果回调*/
            void *pUpStatCbUserArg;                 /*作为上传结果回调的第一个参数*/
    
            void * reserved1;                       /**< 预留1 */
            void * reserved2;                       /**< 预留2 */
    }LinkUploadArg;
    

    附录2:TS封装和上传模块 API定义

    • 初始化 SDK 资源
    /**
     * @brief 初始化上传SDK, 此函数必须在任何其他子功能之前调用。
     *
     * @note 此函数不是线程安全函数。
     *
     * @return LINK_SUCCESS 成功; 其它值 失败
     */
    int LinkInit();
    
    • 创建并启动 MPEG2-TS 封装和上传实例
    /**
     * @brief 创建并启动 MPEG2-TS 封装和上传实例
     *
     * @note 此函数不是线程安全函数。
     *
     * @param[out] pTsMuxUploader 切片上传实例
     * @param[in]  pUserUploadArg 上传需要的参数,用来设置 token,deviceid
     * @return LINK_SUCCESS 成功; 其它值 失败
     */
    int LinkNewUploader(void ** pUploader,
                        const LinkUploadArg *pUploadArg
                        );
    
    • 设置TS文件保存回调
    /**
     * 设置ts切片数据回调
     *
     * 此函数不是线程安全函数。
     *
     * @param[out] pTsMuxUploader 切片上传实例
     * @param[in]  pTsDataCb 回调函数
     * @param[in]  pUserArg 作为pTsDataCb函数的userCtx参数,返回给用户
     */
    void LinkUploaderSetTsOutputCallback(LinkTsMuxUploader *pTsMuxUploader,
                                         LinkTsOutput pTsDataCb,
                                         void * pUserArg
                                         );
    
    • 开始生成视频片段
    /**
     * 设置片段上报的元数据
     *
     * @brief 设置片段上报的元数据,通常使用场景为摄像头检查到移动侦测后调用该接口
     *
     * @param[in] pTsMuxUploader 切片上传实例
     * @param[in] metas 自定义的元数据,key->value结构
     *                metas->isOneShot 非0,仅上报一次后便不在上报
     * @return LINK_SUCCESS 成功; 其它值 失败
     */
    int LinkSetTsType(LinkTsMuxUploader *pTsMuxUploader,
                      LinkSessionMeta *metas
                      );
    
    • 结束当前视频片段
    /**
     * 清空段上报的元数据
     *
     * @brief 清空段上报的元数据,通常使用场景为摄像头检查到移动侦测消失后调用该接口
     *
     * @param[in] pTsMuxUploader 切片上传实例
     */
    void LinkClearTsType(IN LinkTsMuxUploader *pTsMuxUploader);
    
    • 推送视频流数据
    /**
     * 推送视频流数据
     *
     * @param[in] pTsMuxUploader 切片上传实例
     * @param[in] pData 视频数据
     * @param[in] nDataLen 视频数据大小
     * @param[in] nTimestamp 视频时间戳, 如果存在音频,和音频时间戳一定要对应同一个基点
     * @param[in] nIsKeyFrame 是否是关键帧
     * @param[in] nIsSegStart 是否是新的片段开始
     * @param[in] nFrameSysTime 帧对应的系统时间,单位为m毫秒。通常的使用场景是:开启运动侦测时候,送入预录数据关键帧时候填写该预录视频关键帧对应的系统时间,其它情况可以填0
     *                          就是说,如果这个值大于1548064836000,则使用传入的时间,否则取系统时间
     * @return LINK_SUCCESS 成功; 其它值 失败
     */
    int LinkPushVideo(LinkTsMuxUploader *pTsMuxUploader,
                      char * pData,
                      int nDataLen,
                      int64_t nTimestamp,
                      int nIsKeyFrame,
                      int nIsSegStart,
                      int64_t nFrameSysTime
                      );
    
    • 推送音频流数据
    /**
     * 推送音频流数据
     *
     * @param[in] pTsMuxUploader 切片上传实例
     * @param[in] pData 音频数据
     * @param[in] nDataLen 音频数据大小
     * @param[in] nTimestamp 音频时间戳,必须和视频时间戳对应同一个基点
     * @param[in] nFrameSysTime 帧对应的系统时间,单位为m毫秒。目前值填固定的0
     * @return LINK_SUCCESS 成功; 其它值 失败
     */
    int LinkPushAudio(LinkTsMuxUploader *pTsMuxUploader,
                      char * pData,
                      int nDataLen,
                      int64_t nTimestamp,
                      int64_t nFrameSysTime
                      );
    
    • 注销 MPEG2-TS 封装和上传实例
    /**
     * 销毁切片上传实例
     *
     * 如果正在上传会停止上传
     *
     * @param[in,out] pTsMuxUploader 切片上传实例
     * @return NULL
     */
    void LinkFreeUploader(LinkTsMuxUploader **pTsMuxUploader);
    
    • 注销 SDK 资源
    /**
     * 销毁释放 sdk 资源
     *
     * 此函数不是线程安全函数。
     *
     * @return NULL
     */
    void LinkCleanup();
    

    附录3 MPEG2-TS 封装和上传模块调用时序图

    时序图

    以上内容是否对您有帮助?
  • Icon free helper
    Close