一、技术背景
GB/T 28181-2016/2022是中国国家标准,旨在规范网络视频监控设备的接入与互操作性。本模块的设计目标是使不具备国标音视频能力的 Android 终端能够通过平台注册接入到现有的GB/T 28181-2016/2022服务平台。该模块可广泛应用于智能监控、智慧零售、智慧教育、远程办公、生产运输、智慧交通、车载及执法记录仪等多种场景。
二、功能支持
Android终端除支持常规的音视频数据接入外,还可以支持移动设备位置(MobilePosition)订阅和通知、语音广播和语音对讲、云台控制回调和预置位查询,支持对接数据类型如下:
- 编码前数据(目前支持的有YV12/NV21/NV12/I420/RGB24/RGBA32/RGB565等数据类型);
- 编码后数据(如无人机等264/HEVC数据,或者本地解析的MP4音视频数据);
- 拉取RTSP或RTMP流并接入至GB28181平台。
(一)音视频格式
-
视频格式 :支持 H.264/H.265(Android H.265 硬编码)。
-
音频格式 :支持 G.711 A 律、AAC。
(二)音视频处理
-
音量调节 :Android 平台采集端支持实时音量调节。
-
H.264 硬编码 :支持特定机型的 H.264 硬编码。
-
H.265 硬编码 :支持特定机型的 H.265 硬编码。
-
软硬编码参数配置 :支持 GOP 间隔、帧率、码率设置;支持软编码 profile、软编码速度、可变码率设置。
-
传输模式 :支持纯视频、音视频 PS 打包传输。
-
网络传输协议 :支持 RTP OVER UDP 和 RTP OVER TCP 被动模式;支持信令通道网络传输协议 TCP/UDP 设置。
(三)信令与控制
-
注册与注销 :支持注册、注销,支持注册刷新及注册有效期设置。
-
设备目录查询 :支持设备目录查询应答。
-
心跳机制 :支持心跳机制,支持心跳间隔、心跳检测次数设置。
-
移动设备位置 :支持移动设备位置(MobilePosition)订阅和通知。
-
云台控制 :支持云台控制和预置位查询。
(四)其他功能
-
语音广播 :支持语音广播。
-
语音对讲 :支持语音对讲。
-
图像抓拍 :支持图像抓拍。
-
历史视音频文件 :支持历史视音频文件检索、下载及回放。
-
实时水印 :支持动态文字水印、png 水印。
-
镜像功能 :Android 平台支持前置摄像头实时镜像功能。
-
实时静音 :支持实时静音 / 取消静音。
-
实时快照 :支持实时快照。
-
降噪处理 :支持环境音、手机干扰等引起的噪音降噪处理、自动增益、VAD 检测。
-
外部编码数据对接 :支持 YUV 数据、PCM 数据、外部 H.264 数据、外部 AAC 数据对接。
-
扩展录像功能 :支持和录像 SDK 组合使用,实现录像相关功能。
三、系统要求
-
SDK 支持 :Android 5.1 及以上版本。
-
CPU 架构 :支持 armv7、arm64、x86、x86_64。
四、准备工作
(一)代码文件放置
-
确保
SmartPublisherJniV2.java
放置于com.daniulive.smartpublisher
包名下(可在其他包名下调用)。 -
如需集成语音广播、语音对讲功能,确保
SmartPlayerJniV2.java
放置于com.daniulive.smartplayer
包名下(可在其他包名下调用)。
(二)库文件添加
-
将
smartavengine.jar
和smartgbsipagent.jar
添加到工程中。 -
拷贝
libSmartPublisher.so
和libSmartPlayer.so
(如需语音广播或语音对讲)到工程中。
(三)权限配置
在 AndroidManifest.xml
中添加以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
(四)动态加载库
static {System.loadLibrary("SmartPublisher");System.loadLibrary("SmartPlayer");
}
(五)build.gradle 配置
splits {abi {enable truereset()include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'universalApk true}
}
(六)app-name 修改
如需集成到自己系统测试,请用大牛直播 SDK 的 app name,授权版按照授权 app name 正常使用即可。在 strings.xml
中修改如下:
<string name="app_name">SmartPublisherSDKDemo</string>
五、接口详解
(一)信令处理
1. GBSIPAgentListener
该接口主要涉及 GB28181 注册、心跳、设备位置请求等处理,包括以下方法:
方法名 | 描述 |
---|---|
ntsRegisterOK(String dateString) | 注册成功回调,返回注册成功的日期字符串 |
ntsRegisterTimeout() | 注册超时回调 |
ntsRegisterTransportError(String errorInfo) | 注册网络传输层错误回调,返回错误信息 |
ntsOnHeartBeatException(int exceptionCount, String lastExceptionInfo) | 心跳异常回调,返回异常次数和最后一次异常信息 |
ntsOnDevicePositionRequest(String deviceId, int interval) | 设备位置请求处理回调,返回设备 ID 和请求间隔 |
2. GBSIPAgentPlayListener
该接口主要涉及 GB28181 的 Invite、Ack、Bye 等处理,包括以下方法:
方法名 | 描述 |
---|---|
ntsOnInvitePlay(String deviceId, SessionDescription sessionDescription) | 收到 Invite 请求回调,返回设备 ID 和会话描述信息 |
ntsOnPlayInviteResponseException(String deviceId, int statusCode, String errorInfo) | Invite 响应异常回调,返回设备 ID、状态码和错误信息 |
ntsOnCancelPlay(String deviceId) | 取消播放回调,返回设备 ID |
ntsOnAckPlay(String deviceId) | Ack 确认回调,返回设备 ID |
ntsOnByePlay(String deviceId) | Bye 请求回调,返回设备 ID |
ntsOnTerminatePlay(String deviceId) | 终止播放回调,返回设备 ID |
ntsOnPlayDialogTerminated(String deviceId) | 播放对话终止回调,返回设备 ID |
3. GBSIPAgentAudioBroadcastListener
该接口主要涉及 GB28181 语音广播处理相关,包括以下方法:
方法名 | 描述 |
---|---|
ntsOnNotifyBroadcastCommand(String fromUserName, String fromUserNameAtDomain, String sn, String sourceID, String targetID) | 通知广播命令回调,返回发送方用户名、发送方域名、序列号、源 ID 和目标 ID |
ntsOnAudioBroadcast(String commandFromUserName, String commandFromUserNameAtDomain, String sourceID, String targetID) | 语音广播回调,返回命令发送方用户名、命令发送方域名、源 ID 和目标 ID |
ntsOnInviteAudioBroadcastException(String sourceID, String targetID, String errorInfo) | Invite 语音广播异常回调,返回源 ID、目标 ID 和错误信息 |
ntsOnInviteAudioBroadcastTimeout(String sourceID, String targetID) | Invite 语音广播超时回调,返回源 ID 和目标 ID |
ntsOnInviteAudioBroadcastResponse(String sourceID, String targetID, int statusCode, SessionDescription sessionDescription) | Invite 语音广播响应回调,返回源 ID、目标 ID、状态码和会话描述信息 |
ntsOnByeAudioBroadcast(String sourceID, String targetID) | Bye 语音广播回调,返回源 ID 和目标 ID |
ntsOnTerminateAudioBroadcast(String sourceID, String targetID) | 终止语音广播回调,返回源 ID 和目标 ID |
4. GBSIPAgentDeviceControlListener
该接口主要涉及 GB28181 设备控制相关,如远程启动、云台控制等,包括以下方法:
方法名 | 描述 |
---|---|
ntsOnDeviceControlTeleBootCommand(String deviceId, String teleBootValue) | 设备远程启动命令回调,返回设备 ID 和远程启动值 |
ntsOnDeviceControlPTZCmd(String deviceId, String typeValue) | 云台控制命令回调,返回设备 ID 和类型值 |
5. GBSIPAgentQueryCommandListener
该接口主要涉及 GB28181 查询命令,如预置位查询等,包括以下方法:
方法名 | 描述 |
---|---|
ntsOnDevicePresetQueryCommand(String fromUserName, String fromUserNameAtDomain, String sn, String deviceId) | 设备预置位查询命令回调,返回发送方用户名、发送方域名、序列号和设备 ID |
6. GBSIPAgentTalkListener
该接口主要涉及 GB28181 语音对讲相关处理,包括以下方法:
方法名 | 描述 |
---|---|
ntsOnInviteTalk(String deviceId, SessionDescription sessionDescription) | 收到 Invite 对讲请求回调,返回设备 ID 和会话描述信息 |
ntsOnTalkInviteResponseException(String deviceId, int statusCode, String errorInfo) | Invite 对讲响应异常回调,返回设备 ID、状态码和错误信息 |
ntsOnCancelTalk(String deviceId) | 取消对讲回调,返回设备 ID |
ntsOnAckTalk(String deviceId) | Ack 确认回调,返回设备 ID |
ntsOnByeTalk(String deviceId) | Bye 请求回调,返回设备 ID |
ntsOnTerminateTalk(String deviceId) | 终止对讲回调,返回设备 ID |
ntsOnTalkDialogTerminated(String deviceId) | 对讲对话终止回调,返回设备 ID |
7. GBSIPAgentPlaybackListener
该接口主要涉及历史视音频回放相关,包括以下方法:
方法名 | 描述 |
---|---|
ntsOnInvitePlayback(long var1, String var3, SessionDescription var4) | 收到 Invite 回放请求回调,返回相关参数 |
ntsOnPlaybackInviteResponseException(long var1, String var3, int var4, String var5) | Invite 回放响应异常回调,返回相关参数 |
ntsOnCancelPlayback(long var1, String var3) | 取消回放回调,返回相关参数 |
ntsOnAckPlayback(long var1, String var3) | Ack 确认回调,返回相关参数 |
ntsOnPlaybackMANSRTSPPlayCommand(long var1, String var3) | 回放 RTSP 播放命令回调,返回相关参数 |
ntsOnPlaybackMANSRTSPPauseCommand(long var1, String var3) | 回放 RTSP 暂停命令回调,返回相关参数 |
ntsOnPlaybackMANSRTSPScaleCommand(long var1, String var3, double var4) | 回放 RTSP 缩放命令回调,返回相关参数 |
ntsOnPlaybackMANSRTSPSeekCommand(long var1, String var3, double var4) | 回放 RTSP 定位命令回调,返回相关参数 |
ntsOnPlaybackMANSRTSPTeardownCommand(long var1, String var3) | 回放 RTSP 拆卸命令回调,返回相关参数 |
ntsOnByePlayback(long var1, String var3) | Bye 请求回调,返回相关参数 |
ntsOnTerminatePlayback(long var1, String var3) | 终止回放回调,返回相关参数 |
ntsOnPlaybackDialogTerminated(long var1, String var3) | 回放对话终止回调,返回相关参数 |
8. GBSIPAgentDownloadListener
该接口主要涉及历史视音频下载相关,包括以下方法:
方法名 | 描述 |
---|---|
ntsOnInviteDownload(long var1, String var3, SessionDescription var4) | 收到 Invite 下载请求回调,返回相关参数 |
ntsOnDownloadInviteResponseException(long var1, String var3, int var4, String var5) | Invite 下载响应异常回调,返回相关参数 |
ntsOnCancelDownload(long var1, String var3) | 取消下载回调,返回相关参数 |
ntsOnAckDownload(long var1, String var3) | Ack 确认回调,返回相关参数 |
ntsOnDownloadMANSRTSPScaleCommand(long var1, String var3, double var4) | 下载 RTSP 缩放命令回调,返回相关参数 |
ntsOnByeDownload(long var1, String var3) | Bye 请求回调,返回相关参数 |
ntsOnTerminateDownload(long var1, String var3) | 终止下载回调,返回相关参数 |
ntsOnDownloadDialogTerminated(long var1, String var3) | 下载对话终止回调,返回相关参数 |
(二)媒体数据处理
1. RTP 数据发送
RTP Sender(SmartPublisherJniV2.java
)相关接口设计如下:
方法名 | 描述 |
---|---|
public native long CreateRTPSender(int reserve) | 创建 RTP 发送器,返回发送器句柄 |
public native int SetRTPSenderTransportProtocol(long rtp_sender_handle, int transport_protocol) | 设置 RTP 发送器传输协议,参数为发送器句柄和传输协议类型 |
public native int SetRTPSenderIPAddressType(long rtp_sender_handle, int ip_address_type) | 设置 RTP 发送器 IP 地址类型,参数为发送器句柄和 IP 地址类型 |
public native int SetRTPSenderLocalPort(long rtp_sender_handle, int port) | 设置 RTP 发送器本地端口,参数为发送器句柄和端口号 |
public native int SetRTPSenderSSRC(long rtp_sender_handle, String ssrc) | 设置 RTP 发送器 SSRC,参数为发送器句柄和 SSRC 值 |
public native int SetRTPSenderSocketSendBuffer(long rtp_sender_handle, int buffer_size) | 设置 RTP 发送器套接字发送缓冲区大小,参数为发送器句柄和缓冲区大小 |
public native int SetRTPSenderClockRate(long rtp_sender_handle, int clock_rate) | 设置 RTP 发送器时钟速率,参数为发送器句柄和时钟速率 |
public native int SetRTPSenderDestination(long rtp_sender_handle, String address, int port) | 设置 RTP 发送器目标地址和端口,参数为发送器句柄、地址和端口 |
public native int EnableRTPSenderReceive(long rtp_sender_handle, int is_enable) | 启用或禁用 RTP 发送器接收功能,参数为发送器句柄和是否启用标志 |
public native int SetRTPSenderReceiveSSRC(long rtp_sender_handle, String ssrc) | 设置 RTP 发送器接收 SSRC,参数为发送器句柄和 SSRC 值 |
public native int SetRTPSenderReceivePayloadType(long rtp_sender_handle, int payload_type, String encoding_name, int media_type, int clock_rate) | 设置 RTP 发送器接收负载类型,参数为发送器句柄、负载类型、编码名称、媒体类型和时钟速率 |
public native int SetRTPSenderReceivePSClockFrequency(long rtp_sender_handle, int ps_clock_frequency) | 设置 RTP 发送器接收 PS 时钟频率,参数为发送器句柄和 PS 时钟频率 |
public native int SetRTPSenderReceiveAudioSamplingRate(long rtp_sender_handle, int sampling_rate) | 设置 RTP 发送器接收音频采样率,参数为发送器句柄和采样率 |
public native int SetRTPSenderReceiveAudioChannels(long rtp_sender_handle, int channels) | 设置 RTP 发送器接收音频声道数,参数为发送器句柄和声道数 |
public native int InitRTPSender(long rtp_sender_handle) | 初始化 RTP 发送器,参数为发送器句柄 |
public native int GetRTPSenderLocalPort(long rtp_sender_handle) | 获取 RTP 发送器本地端口,参数为发送器句柄 |
public native int UnInitRTPSender(long rtp_sender_handle) | 反初始化 RTP 发送器,参数为发送器句柄 |
public native int DestoryRTPSender(long rtp_sender_handle) | 销毁 RTP 发送器,参数为发送器句柄 |
2. RTP 数据接收
对应 RTP Receiver(SmartPlayerJniV2.java
)相关接口设计如下(如无语音广播或语音对讲相关技术需求,这部分可忽略):
方法名 | 描述 |
---|---|
public native long CreateRTPReceiver(int reserve) | 创建 RTP 接收器,返回接收器句柄 |
public native int SetRTPReceiverTransportProtocol(long rtp_receiver_handle, int transport_protocol) | 设置 RTP 接收器传输协议,参数为接收器句柄和传输协议类型 |
public native int SetRTPReceiverIPAddressType(long rtp_receiver_handle, int ip_address_type) | 设置 RTP 接收器 IP 地址类型,参数为接收器句柄和 IP 地址类型 |
public native int SetRTPReceiverLocalPort(long rtp_receiver_handle, int port) | 设置 RTP 接收器本地端口,参数为接收器句柄和端口号 |
public native int SetRTPReceiverSSRC(long rtp_receiver_handle, String ssrc) | 设置 RTP 接收器 SSRC,参数为接收器句柄和 SSRC 值 |
public native int CreateRTPReceiverSession(long rtp_receiver_handle, int reserve) | 创建 RTP 接收器会话,参数为接收器句柄和保留参数 |
public native int GetRTPReceiverLocalPort(long rtp_receiver_handle) | 获取 RTP 接收器本地端口,参数为接收器句柄 |
public native int SetRTPReceiverPayloadType(long rtp_receiver_handle, int payload_type, String encoding_name, int media_type, int clock_rate) | 设置 RTP 接收器负载类型,参数为接收器句柄、负载类型、编码名称、媒体类型和时钟速率 |
public native int SetRTPReceiverAudioSamplingRate(long rtp_receiver_handle, int sampling_rate) | 设置 RTP 接收器音频采样率,参数为接收器句柄和采样率 |
public native int SetRTPReceiverAudioChannels(long rtp_receiver_handle, int channels) | 设置 RTP 接收器音频声道数,参数为接收器句柄和声道数 |
public native int SetRTPReceiverRemoteAddress(long rtp_receiver_handle, String address, int port) | 设置 RTP 接收器远程地址和端口,参数为接收器句柄、地址和端口 |
public native int InitRTPReceiver(long rtp_receiver_handle) | 初始化 RTP 接收器,参数为接收器句柄 |
public native int UnInitRTPReceiver(long rtp_receiver_handle) | 反初始化 RTP 接收器,参数为接收器句柄 |
public native int DestoryRTPReceiverSession(long rtp_receiver_handle) | 销毁 RTP 接收器会话,参数为接收器句柄 |
public native int DestoryRTPReceiver(long rtp_receiver_handle) | 销毁 RTP 接收器,参数为接收器句柄 |
3. PostAudioPacket
PostAudioPacket
(SmartPlayerJniV2.java
)用于投递音频包给外部 Live source,目前仅于语音对讲使用,接口定义如下:
public native int PostAudioPacket(long handle, int codec_id,java.nio.ByteBuffer packet, int offset, int size, long pts, boolean is_pts_discontinuity,java.nio.ByteBuffer extra_data, int extra_data_offset, int extra_data_size, int sample_rate, int channels);
(三)GB28181 接口调用
对应 GB28181 相关接口调用相关设计如下:
public native int SetGB28181RTPSender(long handle, long rtp_sender_handle, int rtp_payload_type, String encoding_name);
public native int SetGB28181ReceiveAudioPacketCallback(long handle, NTAudioPacketCallback audio_packet_callback);
public native int StartGB28181MediaStream(long handle);
public native int StopGB28181MediaStream(long handle);
六、总结
以上是大牛直播 SDK 发布的 Android 平台 GB28181 设备接入模块的相关说明。除了上述接口设计外,该模块还具备良好的可扩展性,可实现如实时静音、实时快照、按需录像、实时音量调节等功能。