package com.ard.work.sdk.hb.service;
|
|
import com.ard.work.sdk.hb.lib.HBNetSDK;
|
import lombok.extern.slf4j.Slf4j;
|
import java.io.FileWriter;
|
|
/**
|
* @Description: 视频流回调函数
|
* @ClassName: StreamCallBack
|
* @Author: 刘苏义
|
* @Date: 2026年03月11日08:05:40
|
**/
|
@Slf4j
|
public class StreamCallBack implements HBNetSDK.PHB_NET_STREAMDATA_PROC {
|
private final String id;
|
public StreamCallBack(String id) {
|
this.id = id;
|
}
|
|
@Override
|
public void invoke(long lRealHandle, HBNetSDK.HB_NET_DATACALLBACK data) {
|
// 1. 最外层的try-catch捕获所有异常
|
try {
|
// 2. 参数检查
|
if (data == null) {
|
return;
|
}
|
|
data.read(); // 必须加
|
// 3. 只处理视频数据
|
if ((data.dwDataType == 2 || data.dwDataType == 64) && data.dwDataSize > 0) {
|
|
// 4. 再次检查数据有效性
|
if (data.pFrame == null) {
|
return;
|
}
|
|
// 5. 安全的拷贝数据
|
byte[] frameData = new byte[data.dwDataSize];
|
try {
|
data.pFrame.read(0, frameData, 0, data.dwDataSize);
|
} catch (IndexOutOfBoundsException e) {
|
// 数据越界异常
|
System.err.println("数据越界: " + e.getMessage());
|
return;
|
}
|
|
// 6. 入队(非阻塞)
|
CameraStreamQueueManager.offerDataToQueue(id,frameData);
|
//queue.offer(frameData);
|
}
|
|
} catch (Throwable t) {
|
// 7. 捕获所有异常和错误,防止崩溃
|
System.err.println("回调发生严重错误: " + t.getMessage());
|
t.printStackTrace();
|
|
// 8. 记录到日志文件
|
try {
|
FileWriter fw = new FileWriter("/root/test/callback_error.log", true);
|
fw.write(new java.util.Date() + " - " + t.toString() + "\n");
|
fw.close();
|
} catch (Exception e) {
|
// 忽略
|
}
|
}
|
}
|
}
|