海康SDK如何实现视频流转发 5C
    class FRealDataCallBack implements HCNetSDK.FRealDataCallBack_V30
        {    
            //预览回调
            public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser)
            {
                HWND hwnd =hwand;
                switch (dwDataType)
                {
                    case HCNetSDK.NET_DVR_SYSHEAD: //系统头

                        if (!playControl.PlayM4_GetPort(m_lPort)) //获取播放库未使用的通道号
                        {
                            break;
                        }

                        if (dwBufSize > 0)
                        {
                            if (!playControl.PlayM4_SetStreamOpenMode(m_lPort.getValue(), PlayCtrl.STREAME_REALTIME))  //设置实时流播放模式
                            {
                                break;
                            }

                            if (!playControl.PlayM4_OpenStream(m_lPort.getValue(), pBuffer, dwBufSize, 1024 * 1024)) //打开流接口
                            {
                                break;
                            }

                            if (!playControl.PlayM4_Play(m_lPort.getValue(), hwnd)) //播放开始
                            {
                                break;
                            }
                        }
                    case HCNetSDK.NET_DVR_STREAMDATA:   //码流数据
                        if ((dwBufSize > 0) && (m_lPort.getValue().intValue() != -1))
                        {
                            if (!playControl.PlayM4_InputData(m_lPort.getValue(), pBuffer, dwBufSize))  //输入流数据
                            {
                                break;
                            }
                        }
                }
            }


                    回调函数里的pBuffer是否就是流数据,对于实时预览要如何处理流数据的转发

1个回答

您好,您这块儿做完了吗,我在做回放调用回调方法时报错:
unsupported argument type PlayDataCallBack at parameter 1 of function NET_DVR_SetPlayDataCallBack with root cause
PlayDataCallBack 实现了HCNetSDK.FPlayDataCallBack接口,您知道什么问题吗,如果方便的话,能发一下您这块儿的代码吗

qq_29649923
侠菩提227 回复qq_15534145: 大师,求代码啊
6 个月之前 回复
qq_15534145
qq_15534145 回复word_joke: 我临时的处理是先分段下载,然后再推送
7 个月之前 回复
word_joke
word_joke 回复qq_15534145: 你的实现了吗?我的和你基本一样,私有的协议如何转发?获得的视频数据直接保存吗-再FFmpeg?
7 个月之前 回复
qq_15534145
qq_15534145 回复qq_35352132: 最近有事先放下了,现在能在回调中接收到数据流,还没转发
10 个月之前 回复
qq_35352132
我持浮生祭奠流年 回复qq_15534145: 你实现转发了么,可以交流一下
10 个月之前 回复
qq_15534145
qq_15534145 自己回答,PlayDataCallBack要声明为全局变量
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++视频流转发实现
StreamServer.h里定义了下面两个接口, Demo里对这个接口进行了实现, 循环放10张图 struct StreamReader { virtual int GetData(char* buffer, int* length, unsigned long* sequence, unsigned long* timestamp) = 0; virtual ~StreamReader(){} }; struct StreamReaderFactory { virtual StreamReader* CreateStreamReader(int channel) = 0; };
OPENCV+海康SDK视频流车牌识别出错
[code=vb]#include rn#include rn#include rn#include "Windows.h" rn#include "HCNetSDK.h" rn#include "plaympeg4.h" rn#include rn#include "cv.h" rn#include "highgui.h" rn#include rn#include "LPKernelEx.h"rn#include "stdio.h"rn#define USECOLOR 1 rnusing namespace std;rnusing namespace cv;rn#define fasle 0;rn// 图像切割rnMat image_crop;rn//-------------------------------------------- rnint iPicNum = 0;//Set channel NO. rnLONG nPort = -1;rnHWND hWnd = NULL;rnbool verify(RotatedRect rect) rn float error = 0.4;rn const float aspect = 4.7272;rn int min = 15 * aspect * 15; // 面积下限rn int max = 125 * aspect * 125; // 面积上限rnrn float rmin = aspect - aspect * error; // 宽高比下限rn float rmax = aspect + aspect * error; // 宽高比上限rnrn int area = rect.size.width * rect.size.height; // 计算面积rn float r = rect.size.width / rect.size.height; // 计算宽高比rn r = r < 1 ? 1 / r : r;rnrn return area >= min && area <= max && r >= rmin && r <= rmax;rnrnrnvoid yv12toYUV(char *outYuv, char *inYv12, int width, int height, int widthStep)rnrn int col, row;rn unsigned int Y, U, V;rn int tmp;rn int idx;rnrn //printf("widthStep=%d.\n",widthStep); rnrn for (row = 0; row>1; rn tmp = (row / 2)*(width / 2) + (col / 2);rn // if((row==1)&&( col>=1400 &&col<=1600)) rn // rn // printf("col=%d,row=%d,width=%d,tmp=%d.\n",col,row,width,tmp); rn // printf("row*width+col=%d,width*height+width*height/4+tmp=%d,width*height+tmp=%d.\n",row*width+col,width*height+width*height/4+tmp,width*height+tmp); rn // rn Y = (unsigned int)inYv12[row*width + col];rn U = (unsigned int)inYv12[width*height + width * height / 4 + tmp];rn V = (unsigned int)inYv12[width*height + tmp];rn // if ((col==200)) rn // rn // printf("col=%d,row=%d,width=%d,tmp=%d.\n",col,row,width,tmp); rn // printf("width*height+width*height/4+tmp=%d.\n",width*height+width*height/4+tmp); rn // return ; rn // rn if ((idx + col * 3 + 2)> (1200 * widthStep))rn rn //printf("row * widthStep=%d,idx+col*3+2=%d.\n",1200 * widthStep,idx+col*3+2); rn rn outYuv[idx + col * 3] = Y;rn outYuv[idx + col * 3 + 1] = U;rn outYuv[idx + col * 3 + 2] = V;rn rn rn //printf("col=%d,row=%d.\n",col,row); rnrnrnrnrn//解码回调 视频为YUV数据(YV12),音频为PCM数据 rnvoid CALLBACK DecCBFun(long nPort, char * pBuf, long nSize, FRAME_INFO * pFrameInfo, long nReserved1, long nReserved2)rnrn int b;rn int nchannel = 1;rn long lFrameType = pFrameInfo->nType;rnrn if (lFrameType == T_YV12)rn rn#if USECOLOR rn //int start = clock(); rn IplImage* pImgYCrCb = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 3);//得到图像的Y分量 rnrn yv12toYUV(pImgYCrCb->imageData, pBuf, pFrameInfo->nWidth, pFrameInfo->nHeight, pImgYCrCb->widthStep);//得到全部RGB图像 rn IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 3);rn //cvCvtColor(pImgYCrCb,pImg,CV_YUV2RGB);rn cvCvtColor(pImgYCrCb, pImg, CV_YCrCb2RGB);rn //cv::Mat dst(pFrameInfo->nHeight,pFrameInfo->nWidth,CV_8UC3);//这里nHeight为720,nWidth为1280,8UC3表示8bit uchar 无符号类型,3通道值rn // cv::Mat src(pFrameInfo->nHeight + pFrameInfo->nHeight/2,pFrameInfo->nWidth,CV_8UC1,(uchar*)pBuf);rn // cvtColor(src,dst,CV_YUV2BGR_YV12);rn //int end = clock(); rn#else rn IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 1);rn memcpy(pImg->imageData, pBuf, pFrameInfo->nWidth*pFrameInfo->nHeight);rn#endif rn //printf("%d\n",end-start); rn //cvNamedWindow("IPCamera1", 0);rn //cvShowImage("IPCamera1", pImg);rnrnrn IplImage* frame_gray = cvCreateImage(cvGetSize(pImg), pImg->depth, 1);rn cvCvtColor(pImg, frame_gray, CV_RGB2GRAY);rn Mat image = cvarrToMat(frame_gray);rn Mat image2 = cvarrToMat(pImg);rn rn imshow("【原始图】", image);rnrn blur(image, image, Size(5, 5));rn imshow("【去噪后】", image);rnrnrn Sobel(image, image, CV_8U, 1, 0, 3, 1, 0);rn imshow("【sobel滤波】", image);rnrn threshold(image, image, 0, 255, CV_THRESH_OTSU);rn imshow("【otsu阈值化】", image);rnrn Mat element = getStructuringElement(MORPH_RECT, Size(17, 3));rn morphologyEx(image, image, CV_MOP_CLOSE, element);rn imshow("【闭运算】", image);rnrnrn vector> contours;rn findContours(image, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);rn map _map;rnrn for (int i = 0; i < contours.size(); i++)rn rn drawContours(image, contours, i, Scalar(255), 1); // 绘制轮廓rnrn // 绘制矩形rn RotatedRect rect = minAreaRect(contours[i]);rn Point2f vertices[4];rn rect.points(vertices);rn for (int i = 0; i < 4; i++) rn line(image, vertices[i], vertices[(i + 1) % 4], Scalar(255), 2);rn rnrn // 验证rn if (verify(rect)) rn _map[i] = rect;rn rn rn imshow("【轮廓提取】", image);rnrnrn //绘制通过验证的矩形rn int min_diff = 100000;rn int index = 0;rn const float square = 27.75;rnrn map::iterator iter;rn iter = _map.begin();rn while (iter != _map.end()) rnrn RotatedRect rect = iter->second;rn Point2f vertices[4];rn rect.points(vertices);rn for (int j = 0; j < 4; j++) rn line(image, vertices[j], vertices[(j + 1) % 4], Scalar(255), 10);rn rnrn // 选择最接近的矩形rn int perimeter = arcLength(contours[iter->first], true);rn int area = contourArea(contours[iter->first]);rn if (area != 0) rn int squareness = perimeter * perimeter / area;rnrn float diff = abs(squareness - square);rn if (diff < min_diff) rn min_diff = diff;rn index = iter->first;rn rn rn iter++;rn rnrn imshow("【通过验证】", image);rnrnrn // 绘制最接近的矩形rn RotatedRect rect = _map[index];rn Point2f vertices[4];rn rect.points(vertices);rn for (int i = 0; i < 4; i++) rn cout << " asdf" << endl;rn line(image2, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 10);rn rn imshow("【最接近的矩形】", image2);rnrnrnrn Mat image3 = cvarrToMat(frame_gray);rn // 始终保持宽 > 高rn Size rect_size = rect.size;rn if (rect_size.width < rect_size.height) rn swap(rect_size.width, rect_size.height);rn //rn getRectSubPix(image3, rect.size, rect.center, image_crop);rn if (image_crop.rows != 0) imshow("【切割后的车牌】", image_crop);rn rn waitKey(10);rn cvReleaseImage(&frame_gray);rn //cvReleaseImage(&frame_gray);rn rnrn rnrnrnrnrn //imshow("bgr",dst);rn //cvWaitKey(1);rn//#if USECOLOR rn// cvReleaseImage(&pImgYCrCb);rn// cvReleaseImage(&pImg);rn //cvReleaseImage(&src); rn //cvReleaseImage(&dst); rn//#else rn// cvReleaseImage(&pImg);rn//#endif rn //此时是YV12格式的视频数据,保存在pBuf中,可以fwrite(pBuf,nSize,1,Videofile); rn //fwrite(pBuf,nSize,1,fp); rn rn /***************rn else if (lFrameType ==T_AUDIO16)rn rn //此时是音频数据,数据保存在pBuf中,可以fwrite(pBuf,nSize,1,Audiofile);rnrn rn elsern rnrn rn *******************/rnrnrnrnrn///实时流回调 rnvoid CALLBACK fRealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void *pUser)rnrn DWORD dRet;rn switch (dwDataType)rn rn case NET_DVR_SYSHEAD: //系统头 rn if (!PlayM4_GetPort(&nPort)) rn rn break;rn rn if (dwBufSize > 0)rn rn if (!PlayM4_OpenStream(nPort, pBuffer, dwBufSize, 1024 * 1024))rn rn dRet = PlayM4_GetLastError(nPort);rn break;rn rn rnrnrn rn if (!PlayM4_SetDecCallBackExMend(nPort, DecCBFun, NULL, 0, NULL))rn rn dRet = PlayM4_GetLastError(nPort);rn break;rn rnrn //打开视频解码 rn if (!PlayM4_Play(nPort, hWnd))rn rn dRet = PlayM4_GetLastError(nPort);rn break;rn rnrn //打开音频解码, 需要码流是复合流 rn if (!PlayM4_PlaySound(nPort))rn rn dRet = PlayM4_GetLastError(nPort);rn break;rn rn rn break;rnrn case NET_DVR_STREAMDATA: //码流数据 rn if (dwBufSize > 0 && nPort != -1)rn rn BOOL inData = PlayM4_InputData(nPort, pBuffer, dwBufSize);rn while (!inData)rn rn Sleep(10);rn inData = PlayM4_InputData(nPort, pBuffer, dwBufSize);rn OutputDebugString(L"PlayM4_InputData failed \n");rn rn rn break;rn rnrnrnvoid CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)rnrn char tempbuf[256] = 0 ;rn switch (dwType)rn rn case EXCEPTION_RECONNECT: //预览时重连 rn printf("----------reconnect--------%d\n", time(NULL));rn break;rn default:rn break;rn rnrnrnvoid main() rnrn //--------------------------------------- rn // 初始化 rn NET_DVR_Init();rn //设置连接时间与重连时间 rn NET_DVR_SetConnectTime(2000, 1);rn NET_DVR_SetReconnect(10000, true);rnrn //--------------------------------------- rn // 获取控制台窗口句柄 rn //HMODULE hKernel32 = GetModuleHandle((LPCWSTR)"kernel32"); rn //GetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow"); rnrn //--------------------------------------- rn // 注册设备 rn LONG lUserID;rn NET_DVR_DEVICEINFO_V30 struDeviceInfo;rn lUserID = NET_DVR_Login_V30("192.168.1.64", 8000, "admin", "honso123", &struDeviceInfo);rn if (lUserID < 0)rn rn printf("Login error, %d\n", NET_DVR_GetLastError());rn NET_DVR_Cleanup();rn return;rn rnrn //--------------------------------------- rn //设置异常消息回调函数 rn NET_DVR_SetExceptionCallBack_V30(0, NULL, g_ExceptionCallBack, NULL);rnrnrn //cvNamedWindow("IPCamera"); rn //--------------------------------------- rn //启动预览并设置回调数据流 rn //cvNamedWindow("play",1);rn NET_DVR_CLIENTINFO ClientInfo;rn ClientInfo.lChannel = 1; //Channel number 设备通道号 rn ClientInfo.hPlayWnd = NULL; //窗口为空,设备SDK不解码只取流 rn ClientInfo.lLinkMode = 1; //Main Stream rn ClientInfo.sMultiCastIP = NULL;rnrn LONG lRealPlayHandle;rn lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, fRealDataCallBack, NULL, TRUE);rn if (lRealPlayHandle<0)rn rn printf("NET_DVR_RealPlay_V30 failed! Error number: %d\n", NET_DVR_GetLastError());rn return;rn rnrn //cvWaitKey(0); rn Sleep(-1);rnrn //fclose(fp); rn //--------------------------------------- rn //关闭预览 rn if (!NET_DVR_StopRealPlay(lRealPlayHandle))rn rn printf("NET_DVR_StopRealPlay error! Error number: %d\n", NET_DVR_GetLastError());rn return;rn rn //注销用户 rn NET_DVR_Logout(lUserID);rn NET_DVR_Cleanup();rnrn return;rn[/code]rnrn运行时总是提示CRT detected that the application wrote to memory after end of heap buffer还有expression:is_block_type_valid(header->_bloke_use。请假各位大神,怎么解决
关于获取海康的视频流
大家好,我是用现在想获取海康的视频流,然后发送给客户端,我是在自己的机器上测试的(又作服务器又作客户端),我在回调函数中g_RealDataCallBack_V30(该函数是在NET_DVR_RealPlay_V30函数中应用)发送视频流,为什么会失败?请问正确的步骤该怎么做?
海康 流媒体转发 客户端/服务器
实现流媒体的转发C++ ,分客户端和服务器两个模块。
java socket 视频流转发socket.zip
java socket 视频流转发socket.zip java socket 视频流转发socket.zip
java socket 视频流转发socket
java socket 视频流转发socket
海康SDK开发包
海康设备视频二次开发SDK包,用于视频播放二次开发,提供了全面的开发函数,适合各种视频开发的人员入门,实战,完成完美的视频监控
海康SDK开发Demo_C#.
海康SDK开发Demo C#版本 使用设备网络SDK CH-HCNetSDK(Windows32)V4.2.1.8_2.
海康linux32位SDK
由于新版本的增加了一个HCNetSDKCom的目录,导致有时要求将.so文件放在指定目录下动态加载时无法使用,而老板本的此没有,所以这个版本使用起来没有该问题。
海康sdk手册
1 Introduction This specification mainly introduces the PTZ function section of ISAPI Protocol. 2 Conformance All of interface definition in this specification is consistent with that of ISAPI protocol, the specification is a part of ISAPI protocol. The architecture, glossary and relationship are consistent with ISAPI IPMD documentation.
海康SDK delphi demo
海康sdk二次开发delphi例程,包括回调函数
海康SDK二次开发问题
本人想利用海康sdk包,java语言的做二次开发,主要实现对监控的视频能实现共享,所有的连接上的客户端能对该视频进行讨论,分析。请问大家这样的前台界面用什么来表现比较好呢,给出个大概的思路,多谢,散分啦!
海康相机sdk应用
问题:error C4996: 'sprintf': This function or variable may be unsafe. 解决方案:https://www.cnblogs.com/douzi2/p/3974959.html 原因是Visual C++ 2005使用了更加安全的run-time library routines。    新的Security CRT functio...
海康(hikkvision)媒体流SDK
海康媒体流SDK,很好的解决海康流回放时候码流过大的问题,自动完成流控功能。
封装海康设备SDK
本课程基本Qt for windows平台下开发的监控回看界面程序,通过选择界面上的时间和日期可以准确定位观看过去的某一年某一日某个时刻的监控画面,支持对接第三方海康设备的功能,同时也能对于学习QT有很大的帮助。
海康sdk运行java环境
如果系统是64位的就是64位的sdk,如果是32位就用32位的,和是什么系统没有关系,只是系统位数有关 我这边是win7 64位的 环境有intellij和netbeans,都调试成功了 下载海康sdk就自己去官网上面下载 然后解压,我的解压路径是:F:\appsoft\CH-HCNetSDK(Windows64)V5.2.3.3_build20160623 一.inte
海康SDK接口说明
海康SDK接口说明,方便用户对响应摄像头项目进行开发。
海康微视android sdk
海康微视android sdk
海康web端 SDK 1.0.7版
海康直连摄像头,硬盘录像机的 SDK 1.0.7 版,支持 OCX NPAPI
海康SDK的Demo
针对海康设备的demo实例
海康硬盘录像机sdk
海康硬盘录像机sdk c语言 可远程播放视频流及控制云台
Java海康SDK包
主要介绍预览、回放、云台控制、参数配置等基本功能。。。。。。。。。
海康视频二次开发SDK
海康视频二次开发SDK,可以控制NVR,DVR,合码器,解码器等设备视频资源
海康SDK开发Demo_MFC
海康SDK开发Demo MFC版本 使用设备网络SDK CH-HCNetSDK(Windows32)V4.2.1.8_2..
海康WEB SDK javascript
海康威视视频监控WEB调用开发,官方开发包+Demo案例,实现web浏览器在线视频监控预览,并附带例如视频下载等视频操作。JavaScript
海康视频设备sdk
海康设备网络SDK是基于设备私有网络通信协议开发的,为嵌入式网络硬盘录像机, NVR, 网络摄像机, 网络球机, 视频服务器, 解码器, 多屏控制器, 报警主机等产品服务的配套模块,用于远程访问和控制设备软件的二次开发。
海康摄像的SDK
用于海康摄像设备 远程控制 录像抓图 访问等C#开发引用
海康SDK开发运行库
海康SDK开发的程序运行时需要拷贝的库集合,没有这些运行库,程序运行起来看不到画面
熟悉海康SDK的帮忙
NET_DVR_Init;rn NET_DVR_SetDVRMessage(0,0);rn NET_DVR_SetDVRMessCallBack(@callback);rn IUserID := NET_DVR_Login(pchar('192.168.0.201'),8000,pchar('admin'),pchar('12345'),@DEVICEINFO);rn showmessage(inttostr(IUserID));rn //==========================================================rn CLIENTINFO.sMultiCastIP := nil;rn CLIENTINFO.lChannel := 0 ;rn CLIENTINFO.lLinkMode := 0 ;rn CLIENTINFO.hPlayWnd := pnl1.Handle;rn //==========================================================rn NET_DVR_RealPlay(IUserID,@CLIENTINFO);rnrn 注册成功,预览返回也不为-1 panel上就是得不到图像rn 是怎么回事啊
海康录像机的SDK二次开发
下周公司让我做一个项目,关于使用海康录像机SDK的二次开发,我目前还没有接到资料,但是我负责的部分将SDK封装成类,然后让另外一个用C#的人去调用,来开发之用,我不知道封装成什么文件,还是dll,还是什么之类的,有这方面经验的人希望给我思路和步骤,谢谢!
海康网络摄像机SDK
海康网络摄像机SDK,里面有C++,C#,Java方面的DEMO文件
海康sdk转换成C#
海康sdk转换成C#,通过p/i 转换,欢饮大家拍砖
海康摄像头SDK
海康摄像头操作,C# 代码 32,64 位能正常运行
海康sdk二次开发代码
海康sdk二次开发代码demo,包括浏览视频和控制摄像头等操作
海康最新SDK文档
海康最新SDK,各位监控系统二次开发爱好者必需品,基于海康硬件设备
海康SDK源码
海康SDK的源码,内有说明文档和源代码。说明的非常详细
海康IPC的SDK
海康摄像机IPC开发文档,介绍的很详细,有利于开发者快速接入
C#海康SDK开发
想弄一个手动抓拍,但是不知怎么入手,dll加载哪一个?
linux下调用海康sdk
在linux下用dlopen去连接海康linux下的sdk so文件 连接无法成功 我自己实现的so文件可以连接 请教一下有哪位知道是什么情况
海康SDK截图
     最近使用海康硬盘录像机录像截图,看了其官方使用文档及提供的SDK,不愧是上市公司,使用文档描述很详细,SDK采用C语言描述; SDK没有演示如何通过实时视频流截图,下面是自己通过多次测试后成功截图的代码:   /** *@brief 初始化Playctrl库 */ void InitRealStream() { // 显示组件,在使用过程中发现必须先调用play(...
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview