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) { // 忽略 } } } }