public Form1()
{
sdrc = new STREAM_DIRECT_READ_CALLBACK(STREAM_DIRECT_READ_CALLBACK1);
HikVisionSDK.RegisterStreamDirectReadCallback(sdrc, ChannelHandle);
//初始化串口
InitializeComponent();
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox);
serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
if (!serialPort1.IsOpen)
{
serialPort1.Open();
} interfaceUpdateHandle1 = new HandleInterfaceUpdateDelegate(UpdateTextBox1);
serialPort2.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort2_DataReceived);
if (!serialPort2.IsOpen)
{
serialPort2.Open();
} //设置默认的视频格式
HikVisionSDK.SetDefaultVideoStandard(VideoStandard_t.StandardPAL); //初始化板卡
if (HikVisionSDK.InitDSPs() < 0)
{
MessageBox.Show("初始化DSPs失败!!");
return;
} if (HikVisionSDK.GetTotalDSPs() == 0)
{
MessageBox.Show("没有可用的通道!!您是否已经启动服务器端?");
return;
}
//打开通道
ChannelHandle = HikVisionSDK.ChannelOpen(1);
//设置编码帧结构、帧率
HikVisionSDK.SetIBPMode(ChannelHandle, 100, 2, 1, 25);
//设置编码图像质量
HikVisionSDK.SetDefaultQuant(ChannelHandle, 15, 15, 20);
//HikVisionSDK.RegisterStreamDirectReadCallback(new STREAM_DIRECT_READ_CALLBACK(STREAM_DIRECT_READ_CALLBACK1), ChannelHandle);
}
//出发读取串口数据
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
System.Threading.Thread.Sleep(100);
byte[] ReadBuffer = new byte[serialPort1.ReadBufferSize];
serialPort1.Read(ReadBuffer, 0, ReadBuffer.Length);
this.Invoke(interfaceUpdateHandle, new string[] { Encoding.UTF8.GetString(ReadBuffer) });
serialPort1.DiscardInBuffer();
//串口数据
MessageBox.Show(txrReceive.Text); if (CaptureState == 1)
{
if (tiaoma == txrReceive.Text)
{
//停止
CaptureState = 0;
using (FileStream fs = new FileStream("C:\\hik.264", FileMode.Append))
{
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(endCode);
bw.Close();
}
tiaoma = "";
}
else
{
//异常
}
}
else
{
//开始
using (FileStream fs = new FileStream("C:\\hik.264", FileMode.Create))
{
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(FileHeader); //报错位置 我认为是认为STREAM_DIRECT_READ_CALLBACK1没有执行导致
bw.Flush();
bw.Close();
} CaptureState = 1;
}
} public int STREAM_DIRECT_READ_CALLBACK1(int channelNum, IntPtr DataBuf, int Length, FrameType_t frameType, IntPtr context)
{
//int status = 0;
//HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 0);
//return 0;
//测试
MessageBox.Show("调用回调函数!STREAM_DIRECT_READ_CALLBACK1"); int status = 0; if (frameType > 0)
{
if (frameType == FrameType_t.PktSysHeader)
{
FileHeader = new byte[Length];
Marshal.Copy(DataBuf, FileHeader, 0, Length);
FileHeaderLen = Length;
} if (frameType == FrameType_t.PktIFrames || frameType == FrameType_t.PktSubIFrames)
status = 1;
else
status = 0; if (frameType == FrameType_t.PktMotionDetection || frameType == FrameType_t.PktOrigImage)
return 0;
} if (Length == 0)
{
//TRACE("no data ?\n");
return 0;
} if (frameType == FrameType_t.PktAudioFrames)
{
WriterVideoCapture(Length, DataBuf);
//写文件
// _write(gFileHandleQcif[channelNum],DataBuf,Length);
//HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 1);
// _write(gFileHandle[channelNum], DataBuf, Length);
HikSerdll.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 0);
}
else if (frameType == FrameType_t.PktSubIFrames || frameType == FrameType_t.PktSubPFrames || frameType == FrameType_t.PktSubBBPFrames || frameType == FrameType_t.PktSubSysHeader)
{
// _write(gFileHandleQcif[channelNum],DataBuf,Length);
HikSerdll.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 1);
}
else
{
WriterVideoCapture(Length, DataBuf);
HikSerdll.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 0);
} return 0; } /// <summary>
/// 将数据流写入视频文件
/// </summary>
/// <param name="length"></param>
/// <param name="dataBuf"></param>
private void WriterVideoCapture(int length, IntPtr dataBuf)
{
if (CaptureState == 1)
{
using (FileStream fs = new FileStream("C:\\hik.264", FileMode.Append))
{
BinaryWriter bw = new BinaryWriter(fs); byte[] byteBuf = new byte[length];
Marshal.Copy(dataBuf, byteBuf, 0, length);
bw.Write(byteBuf);
bw.Flush();
bw.Close();
}
}
} private void UpdateTextBox(string text)
{
MessageBox.Show("调用回调函数!UpdateTextBox");
txrReceive.Text = text;
}
UpdateTextBox 可以调到 但STREAM_DIRECT_READ_CALLBACK1 就是不执行 大家帮我看看是哪出问题了 方法是从C++的sdk调的 确定已经导进来。
{
sdrc = new STREAM_DIRECT_READ_CALLBACK(STREAM_DIRECT_READ_CALLBACK1);
HikVisionSDK.RegisterStreamDirectReadCallback(sdrc, ChannelHandle);
//初始化串口
InitializeComponent();
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox);
serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
if (!serialPort1.IsOpen)
{
serialPort1.Open();
} interfaceUpdateHandle1 = new HandleInterfaceUpdateDelegate(UpdateTextBox1);
serialPort2.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort2_DataReceived);
if (!serialPort2.IsOpen)
{
serialPort2.Open();
} //设置默认的视频格式
HikVisionSDK.SetDefaultVideoStandard(VideoStandard_t.StandardPAL); //初始化板卡
if (HikVisionSDK.InitDSPs() < 0)
{
MessageBox.Show("初始化DSPs失败!!");
return;
} if (HikVisionSDK.GetTotalDSPs() == 0)
{
MessageBox.Show("没有可用的通道!!您是否已经启动服务器端?");
return;
}
//打开通道
ChannelHandle = HikVisionSDK.ChannelOpen(1);
//设置编码帧结构、帧率
HikVisionSDK.SetIBPMode(ChannelHandle, 100, 2, 1, 25);
//设置编码图像质量
HikVisionSDK.SetDefaultQuant(ChannelHandle, 15, 15, 20);
//HikVisionSDK.RegisterStreamDirectReadCallback(new STREAM_DIRECT_READ_CALLBACK(STREAM_DIRECT_READ_CALLBACK1), ChannelHandle);
}
//出发读取串口数据
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
System.Threading.Thread.Sleep(100);
byte[] ReadBuffer = new byte[serialPort1.ReadBufferSize];
serialPort1.Read(ReadBuffer, 0, ReadBuffer.Length);
this.Invoke(interfaceUpdateHandle, new string[] { Encoding.UTF8.GetString(ReadBuffer) });
serialPort1.DiscardInBuffer();
//串口数据
MessageBox.Show(txrReceive.Text); if (CaptureState == 1)
{
if (tiaoma == txrReceive.Text)
{
//停止
CaptureState = 0;
using (FileStream fs = new FileStream("C:\\hik.264", FileMode.Append))
{
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(endCode);
bw.Close();
}
tiaoma = "";
}
else
{
//异常
}
}
else
{
//开始
using (FileStream fs = new FileStream("C:\\hik.264", FileMode.Create))
{
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(FileHeader); //报错位置 我认为是认为STREAM_DIRECT_READ_CALLBACK1没有执行导致
bw.Flush();
bw.Close();
} CaptureState = 1;
}
} public int STREAM_DIRECT_READ_CALLBACK1(int channelNum, IntPtr DataBuf, int Length, FrameType_t frameType, IntPtr context)
{
//int status = 0;
//HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 0);
//return 0;
//测试
MessageBox.Show("调用回调函数!STREAM_DIRECT_READ_CALLBACK1"); int status = 0; if (frameType > 0)
{
if (frameType == FrameType_t.PktSysHeader)
{
FileHeader = new byte[Length];
Marshal.Copy(DataBuf, FileHeader, 0, Length);
FileHeaderLen = Length;
} if (frameType == FrameType_t.PktIFrames || frameType == FrameType_t.PktSubIFrames)
status = 1;
else
status = 0; if (frameType == FrameType_t.PktMotionDetection || frameType == FrameType_t.PktOrigImage)
return 0;
} if (Length == 0)
{
//TRACE("no data ?\n");
return 0;
} if (frameType == FrameType_t.PktAudioFrames)
{
WriterVideoCapture(Length, DataBuf);
//写文件
// _write(gFileHandleQcif[channelNum],DataBuf,Length);
//HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 1);
// _write(gFileHandle[channelNum], DataBuf, Length);
HikSerdll.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 0);
}
else if (frameType == FrameType_t.PktSubIFrames || frameType == FrameType_t.PktSubPFrames || frameType == FrameType_t.PktSubBBPFrames || frameType == FrameType_t.PktSubSysHeader)
{
// _write(gFileHandleQcif[channelNum],DataBuf,Length);
HikSerdll.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 1);
}
else
{
WriterVideoCapture(Length, DataBuf);
HikSerdll.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 0);
} return 0; } /// <summary>
/// 将数据流写入视频文件
/// </summary>
/// <param name="length"></param>
/// <param name="dataBuf"></param>
private void WriterVideoCapture(int length, IntPtr dataBuf)
{
if (CaptureState == 1)
{
using (FileStream fs = new FileStream("C:\\hik.264", FileMode.Append))
{
BinaryWriter bw = new BinaryWriter(fs); byte[] byteBuf = new byte[length];
Marshal.Copy(dataBuf, byteBuf, 0, length);
bw.Write(byteBuf);
bw.Flush();
bw.Close();
}
}
} private void UpdateTextBox(string text)
{
MessageBox.Show("调用回调函数!UpdateTextBox");
txrReceive.Text = text;
}
UpdateTextBox 可以调到 但STREAM_DIRECT_READ_CALLBACK1 就是不执行 大家帮我看看是哪出问题了 方法是从C++的sdk调的 确定已经导进来。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货