liusuyi
2026-05-12 9f327c33730ba10cb2d89aff99b727502232e968
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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) {
                // 忽略
            }
        }
    }
}