揭秘GB28181标准下如何打造超能执法记录仪,引领警务新时代!

简介: 【10月更文挑战第3天】GB28181是中国公共安全行业标准,对智慧可视化指挥控制系统建设至关重要。本文探讨了如何在该标准下设计符合现代警务需求的执法记录仪,包括环境准备、引入依赖、SDK初始化、视频采集与编码、存储与传输等关键技术环节,并提供了具体的设计思路和代码示例,助力实现高效稳定的指挥调度功能。

GB28181作为中国公共安全行业标准之一,对于推动智慧可视化指挥控制系统的建设具有重要意义。特别是在执法记录仪的设计方面,如何结合GB28181标准,实现高效、稳定且兼容性强的指挥调度功能,成为了亟待解决的问题。本文将从技术角度出发,探讨如何在GB28181标准下设计一款符合现代警务需求的执法记录仪,并提供一些设计思路和代码示例。

一、环境准备

为了更好地进行讨论,我们假设已经搭建好了基于GB28181标准的指挥控制中心,并且该中心能够支持执法记录仪的接入和数据传输。同时,我们也准备好了一款能够运行Android操作系统的执法记录仪设备。

二、引入依赖

在执法记录仪的设计过程中,我们需要使用到GB28181相关的SDK或者库来实现设备的接入和数据的传输。假设我们使用了一个名为gb28181-android-sdk的开源SDK,它提供了基本的GB28181协议支持。

dependencies {
   
    implementation 'com.example:gb28181-android-sdk:1.0.0'
}

三、初始化SDK

在执法记录仪启动时初始化GB28181 SDK,并设置回调接口用于接收事件通知。

public class MainApplication extends Application {
   

    @Override
    public void onCreate() {
   
        super.onCreate();
        GB28181SDK.init(this, new GB28181Callback() {
   
            @Override
            public void onDeviceConnected(String deviceId) {
   
                Log.d("GB28181", "设备连接成功: " + deviceId);
            }

            @Override
            public void onDeviceDisconnected(String deviceId) {
   
                Log.d("GB28181", "设备断开连接: " + deviceId);
            }

            @Override
            public void onVideoStreamReceived(String deviceId, int channel, byte[] data) {
   
                Log.d("GB28181", "接收到视频数据: " + deviceId);
                handleVideoData(deviceId, channel, data);
            }
        });
    }
}

四、设计思路

执法记录仪的核心在于视频采集、存储和传输。为了满足GB28181标准的要求,我们需要考虑以下几个关键点:

  • 视频采集:使用设备内置摄像头采集视频数据。
  • 视频编码:将采集到的原始视频数据编码成H.264格式,以便在网络上传输。
  • 视频存储:在本地存储视频数据,以备后续查看或作为证据使用。
  • 视频传输:通过GB28181协议将视频数据传输到指挥控制中心。

五、视频采集与编码

使用Camera2 API进行视频采集,并使用MediaCodec进行视频编码。

private CameraDevice cameraDevice;
private MediaCodec mediaCodec;
private MediaMuxer mediaMuxer;

public void startVideoCapture() {
   
    // 打开摄像头
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    String cameraId = getBackFacingCameraId(cameraManager);
    try {
   
        cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
   
            @Override
            public void onOpened(@NonNull CameraDevice camera) {
   
                cameraDevice = camera;
                setupVideoCapture();
            }

            @Override
            public void onDisconnected(@NonNull CameraDevice camera) {
   
                camera.close();
            }
        }, null);
    } catch (CameraAccessException e) {
   
        Log.e("GB28181", "打开摄像头失败", e);
    }
}

private void setupVideoCapture() {
   
    // 设置预览和录制参数
    SurfaceTexture surfaceTexture = new SurfaceTexture(0);
    Surface previewSurface = new Surface(surfaceTexture);
    Surface recordingSurface = new Surface(mediaCodec.createInputSurface());

    // 创建MediaCodec实例
    mediaCodec = MediaCodec.createByCodecName(MediaFormat.MIMETYPE_VIDEO_AVC);
    MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 640, 480);
    format.setInteger(MediaFormat.KEY_BIT_RATE, 2000000);
    format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
    format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
    mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);

    // 创建MediaMuxer实例
    mediaMuxer = new MediaMuxer("/sdcard/test.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);

    // 开始录制
    mediaCodec.start();
    mediaMuxer.start();

    // 创建CaptureRequest
    CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
    builder.addTarget(previewSurface);
    builder.addTarget(recordingSurface);

    // 开始捕获
    cameraDevice.createCaptureSession(Arrays.asList(previewSurface, recordingSurface), new CameraCaptureSession.StateCallback() {
   
        @Override
        public void onConfigured(@NonNull CameraCaptureSession session) {
   
            try {
   
                session.setRepeatingRequest(builder.build(), null, null);
            } catch (CameraAccessException e) {
   
                Log.e("GB28181", "设置重复请求失败", e);
            }
        }

        @Override
        public void onConfigureFailed(@NonNull CameraCaptureSession session) {
   
            Log.e("GB28181", "配置会话失败");
        }
    }, null);
}

private String getBackFacingCameraId(CameraManager cameraManager) throws CameraAccessException {
   
    for (String id : cameraManager.getCameraIdList()) {
   
        CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(id);
        int orientation = characteristics.get(CameraCharacteristics.LENS_FACING);
        if (orientation == CameraCharacteristics.LENS_FACING_BACK) {
   
            return id;
        }
    }
    return null;
}

六、视频存储与传输

在编码完成后,我们需要将编码好的视频数据存储到本地,并通过GB28181协议传输到指挥控制中心。

public void handleVideoData(String deviceId, int channel, byte[] data) {
   
    // 存储视频数据
    File videoFile = new File("/sdcard/" + deviceId + ".h264");
    FileOutputStream fos = null;
    try {
   
        fos = new FileOutputStream(videoFile, true);
        fos.write(data);
    } catch (IOException e) {
   
        Log.e("GB28181", "写入视频数据失败", e);
    } finally {
   
        if (fos != null) {
   
            try {
   
                fos.close();
            } catch (IOException e) {
   
                Log.e("GB28181", "关闭文件输出流失败", e);
            }
        }
    }

    // 通过GB28181协议传输视频数据
    GB28181SDK.sendVideoData(deviceId, channel, data);
}

七、总结

通过上述步骤,我们可以在GB28181标准下设计一款执法记录仪,该记录仪不仅能够采集和编码视频数据,还能将其存储到本地,并通过网络传输到指挥控制中心。需要注意的是,实际开发过程中还需要考虑网络状况、异常处理等因素,确保应用稳定可靠。此外,考虑到不同设备可能支持的视频编码类型不同,建议在请求视频流前查询设备能力集,以确保兼容性。

目录
相关文章
|
编解码 安全 索引
媒体编解码器MediaCodec
媒体编解码器MediaCodec
509 0
|
编解码 监控 网络协议
Android平台音视频推送选RTMP还是GB28181?
早在2015年,我们发布了RTMP直播推送模块,那时候音视频直播这块场景需求,还不像现在这么普遍,我们做这块的初衷,主要是为了实现移动单兵应急指挥系统的低延迟音视频数据传输。好多开发者可能会疑惑,走RTMP怎么可能低延迟?网上看到的RTMP推拉流延迟,总归要2-3秒起,如果是自己实现框架,RTMP推拉流逻辑自己实现的话,延迟确实可以控制在毫秒级,这个已无需赘述。
192 0
|
安全 API 开发工具
Android14 适配之——targetSdkVersion 升级到 34 需要注意些什么?(下)
Android14 适配之——targetSdkVersion 升级到 34 需要注意些什么?(下)
1770 0
|
数据采集 存储 分布式计算
构建智能数据湖:DataWorks助力企业实现数据驱动转型
【8月更文第25天】本文将详细介绍如何利用阿里巴巴云的DataWorks平台构建一个智能、灵活、可扩展的数据湖存储体系,以帮助企业实现数据驱动的业务转型。我们将通过具体的案例和技术实践来展示DataWorks如何集成各种数据源,并通过数据湖进行高级分析和挖掘,最终基于数据洞察驱动业务增长和创新。
626 53
|
存储 安全 Linux
|
监控 Java 开发工具
如何快速对接Android平台GB28181接入模块(SmartGBD)
大牛直播SDK推出的Android平台GB28181接入SDK(SmartGBD),可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终端等场景,可能是业内为数不多功能齐全性能优异的商业级水准GB28181接入SDK。
254 0
|
Python
python中的二进制、八进制、十六进制的相互转换
python中的二进制、八进制、十六进制的相互转换
318 0
|
Web App开发 缓存 JavaScript
如何排查 Electron V8 引发的内存 OOM 问题(中)
如何排查 Electron V8 引发的内存 OOM 问题(中)
1736 0
|
编解码 测试技术 开发工具
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
252 1
|
编解码 网络协议 应用服务中间件
公网可用的RTMP、RTSP测试地址
好多博客提到的公网可测试的RTSP和RTMP URL大多都不用了,以下是大牛直播SDK(Github)于2021年3月亲测可用的几个URL,有其他可用的URL,也欢迎大家在评论区回复。
21398 0