Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.8k views
in Technique[技术] by (71.8m points)

海康威视设备网络sdk预览获取的码流如何转换推送到rtmp

问题描述

海康威视设备网络sdk预览获取的码流如何转换推送到rtmp

问题出现的环境背景及自己尝试过哪些方法

海康的接口文档
预览接口NET_DVR_RealPlay_V40中预览参数的播放窗口句柄(hPlayWnd)可以设置为空值,直接设置回调函数,或者调用预览接口之后,通过NET_DVR_SetRealDataCallBack、NET_DVR_SetStandardDataCallBack设置回调函数,回调获取实时流数据(前两个接口设置的回调获取的是PS封装的码流,后者获取的是标准RTP封装的码流)之后用户后续自己处理,比如二进制流方式写入文件保存成录像或者调用播放库解码显示等操作。

image.png

目前能得到码流byte数组
image.png
image.png

之前做过海康的rtsp转rtmp,用的javaCV的
FFmpegFrameGrabber 和 FFmpegFrameRecorder

现在通过获取的byte[] 怎么解析转换为rtmp,求解

相关代码

/******************************************************************************
 *内部类:   FRealDataCallBack *          实现预览回调数据 ******************************************************************************/class FRealDataCallBack implements HCNetSDK.FRealDataCallBack_V30 {
    /**
 * 预览回调 * * @param lRealHandle 当前的预览句柄
 * @param dwDataType 数据类型
 * @param pBuffer 存放数据的缓冲区指针
 * @param dwBufSize 缓冲区大小
 * @param pUser 用户数据
 */ @Override
 public void invoke(int lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser) {
        System.out.println(dwBufSize);
 byte[] bytes = ref2Bytes(pBuffer, dwBufSize);
 if (videoConverter == null) {
            //videoConverter = new VideoConverter();
 }
        // PS封装的码流
 if (dwDataType == HCNetSDK.NET_DVR_SYSHEAD) { //系统头
 System.out.println("系统头");
 } else if (dwDataType == HCNetSDK.NET_DVR_STREAMDATA) { //流数据(包括复合流或音视频分开的视频流数据)
 System.out.println("码流数据");
 //videoConverter.convert(bytes);
 } else if (dwDataType == HCNetSDK.NET_DVR_AUDIOSTREAMDATA) { // 音频数据
 System.out.println("音频数据");
 } else if (dwDataType == HCNetSDK.NET_DVR_PRIVATE_DATA) { //私有数据,包括智能信息
 System.out.println("私有数据,包括智能信息");
 } else {
            System.out.println("其他: " + dwDataType);
 }
        System.out.println(HexUtils.bytes2Hex(bytes));
 System.out.println("-------------------------------------------------");
 }
    public byte[] ref2Bytes(ByteByReference buf, int dwBufSize) {
        return buf.getPointer().getByteArray(0, dwBufSize); //此处为通过字节指针获取指定长度的字节数组
 }
}

你期待的结果是什么?实际看到的错误信息又是什么?

通过海康sdk的预览回调,获取的码流,转换推送到rtmp


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
等待大神解答

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...