大家好,我通過socket遠程通訊利用mina框架撰寫了一個遠程獲取海康視頻流實作實時查看,目前網路通信已經通過,但是在服務端如何獲取攝像流資料發送給客戶端這里遇到了困難,不知如何將海康設備資料流提取出來發送給客戶端,客戶端實作預覽
海康SDK提供的回呼原始碼:目前我把它加入我的原始碼內我要怎么做才能獲取到求各位高手幫助
public class FRealDataCallBack implements HCNetSDK.FRealDataCallBack_V30{
@Override
public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize,
Pointer pUser) {
// TODO Auto-generated method stub
HWND hwnd = new HWND(Native.getComponentPointer(top));
switch (dwDataType) {
case HCNetSDK.NET_DVR_SYSHEAD:
System.out.println("系統頭資料");
if (!playControl.PlayM4_GetPort(m_lPort)) {
System.out.println("播放埠號"+playControl.PlayM4_GetPort(m_lPort));
break;
}
if (dwBufSize>0) {
if (!playControl.PlayM4_SetStreamOpenMode(m_lPort.getValue(),PlayCtrl.STREAME_REALTIME)) {
System.out.println("設定實時流播放模式");
break;
}
if (!playControl.PlayM4_OpenStream(m_lPort.getValue(), pBuffer, dwBufSize, 1024*1024)) //打開流介面
{
System.out.println("打開流介面");
break;
}
if (!playControl.PlayM4_Play(m_lPort.getValue(), hwnd)) //播放開始
{
System.out.println("開始播放");
break;
}
}
break;
case HCNetSDK.NET_DVR_STREAMDATA:
if ((dwBufSize > 0) && (m_lPort.getValue().intValue() != -1)) {
if (!playControl.PlayM4_InputData(m_lPort.getValue(), pBuffer, dwBufSize)) //輸入流資料 {
break;
}
}
uj5u.com熱心網友回復:
海康不是提供有demo嗎uj5u.com熱心網友回復:
有但是不知如何怎么取出這個流資料uj5u.com熱心網友回復:
百度搜相關關鍵字。uj5u.com熱心網友回復:
流資料是不是都在pBuffer這個里面。可以嘗試保存讀取等uj5u.com熱心網友回復:
樓主你搞定了么??求分享下uj5u.com熱心網友回復:
自己做服務中轉?海康有DEMO的;其實你用海康的,肯定都有DEMO的。
uj5u.com熱心網友回復:
樓主能把相關方面的代碼給發一下么,最近在弄這個,真的是一點頭緒都沒有呢uj5u.com熱心網友回復:
其實網路攝像頭都是提供rtsp這種的吧,任意支持這個協議的都能播放。uj5u.com熱心網友回復:
海康播放庫有一個設定解碼回呼函式PlayM4_SetDecCallBackEx(int nPort, DECCBFUN DecCBFun, IntPtr pDest, int nDestSize);第二個引數就是回呼函式,解碼后的YUV資料會傳到回呼函式中的buff引數中
拿著這個YUV資料經過處理就可以了,不知道我理解的對不對
uj5u.com熱心網友回復:
海康預覽回呼函式中有碼流資訊;但是是以指標型別存在的 IntPtr pBuffer,你需要將這個指標轉出byte[],然后可以通過Tcp Socket進行發送,直接看代碼:
private void RealDataCallBack(Int32 lRealHandle, UInt32 dwDataType, IntPtr pBuffer, UInt32 dwBufSize, IntPtr pUser)
{
..........//播放庫播放代碼略過了,dome中都有
byte[] write = new byte[dwBufSize];
Marshal.Copy(pBuffer, write, 0, write.Length);
ThreadPool.QueueUserWorkItem(new WaitCallback(sendSocket.SendMsg), write); //sendSocket是一個Socket客戶端類在發送至之前實體化連接;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/43661.html
標籤:網絡編程
上一篇:求教:findcontours函式輸出的contours是按相鄰資料排列的么
下一篇:Matlab影像切邊
