114黄页企业名录在哪里买,郑州厉害的seo优化顾问,网站备案幕布怎么做,做网站都有什么项目技术背景
我们在做Android平台GB28181设备接入模块的时候#xff0c;对接过好多开发者#xff0c;他们都是用于执法记录仪场景#xff0c;执法记录仪是一种便携式设备#xff0c;用于记录执法人员的行动和接触情况#xff0c;通过实时回传音视频数据和实时位置信息给指挥…技术背景
我们在做Android平台GB28181设备接入模块的时候对接过好多开发者他们都是用于执法记录仪场景执法记录仪是一种便携式设备用于记录执法人员的行动和接触情况通过实时回传音视频数据和实时位置信息给指挥中心把现场的情况实时反馈给指挥中心指挥中心可以通过语音广播和语音对讲实现和前端执法人员的音视频通话。 GB28181执法记录仪由以下几个部分组成
1. 硬件选型选择符合GB28181标准的执法记录仪设备具备高清晰度摄像、音频采集和存储的能力。设备应具备稳定的网络连接和数据传输能力。
2. 设备接入执法记录仪通过网络接入到GB28181视频监控系统中。可以通过设备的唯一标识和密码完成设备的注册和鉴权以便在系统中实现执法记录仪的统一管理和控制。
3. 视频和音频流配置配置执法记录仪的视频和音频编码参数如分辨率、帧率、比特率等。确保符合GB28181标准的音视频编码要求。
4. 流媒体传输执法记录仪通过GB28181的媒体流传输协议如RTP/RTCP将视频和音频流上传到视频监控系统中。可以使用TCP或UDP作为传输协议并通过相关配置确保流媒体传输的稳定性和实时性。
5. 存储和管理执法记录仪设备应具备足够的存储容量可将视频和音频数据保存在本地存储设备中。同时支持对存储内容进行管理和检索例如按时间、地点和事件等对存储的媒体数据进行分类和查询。
6. 控制和控制中心通过GB28181的信令协议如SIP进行设备的远程控制。支持对执法记录仪的实时预览、录制、拍照和上传等操作。控制中心可以集中管理和控制多个执法记录仪设备并对其进行配置和命令下发。
技术实现
针对Android平台GB28181执法记录仪场景大牛直播SDK设计的功能如下 [视频格式]H.264/H.265(Android H.265硬编码) [音频格式]G.711 A律、AAC [音量调节]Android平台采集端支持实时音量调节 [H.264硬编码]支持H.264特定机型硬编码 [H.265硬编码]支持H.265特定机型硬编码 [软硬编码参数配置]支持gop间隔、帧率、bit-rate设置 [软编码参数配置]支持软编码profile、软编码速度、可变码率设置 支持横屏、竖屏推流 Android平台支持后台service推送屏幕(推送屏幕需要5.0版本)支持纯视频、音视频PS打包传输支持RTP OVER UDP和RTP OVER TCP被动模式TCP媒体流传输客户端支持信令通道网络传输协议TCP/UDP设置支持注册、注销支持注册刷新及注册有效期设置支持设备目录查询应答支持心跳机制支持心跳间隔、心跳检测次数设置支持移动设备位置(MobilePosition)订阅和通知 适用国家标准GB/T 28181—2016支持语音广播支持语音对讲支持历史视音频文件检索支持历史视音频文件下载支持云台控制和预置位查询 [实时水印]支持动态文字水印、png水印 [镜像]Android平台支持前置摄像头实时镜像功能 [实时静音]支持实时静音/取消静音 [实时快照]支持实时快照 [降噪]支持环境音、手机干扰等引起的噪音降噪处理、自动增益、VAD检测 [外部编码前视频数据对接]支持YUV数据对接 [外部编码前音频数据对接]支持PCM对接 [外部编码后视频数据对接]支持外部H.264数据对接 [外部编码后音频数据对接]外部AAC数据对接 [扩展录像功能]支持和录像模块组合使用录像相关功能。
接口详解 以Android平台Camera2对接为例信令部分需要实现如下标红接口
public class MainActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener, Camera2Listener,GBSIPAgentListener, GBSIPAgentPlayListener, GBSIPAgentAudioBroadcastListener,GBSIPAgentDeviceControlListener, GBSIPAgentQueryCommandListener, GBSIPAgentTalkListener{
}
媒体数据处理接口可参照SmartPublisherJniV2.java如需语音广播或语音对讲可参照SmartPlayerJniV2.java。
信令处理
GBSIPAgentListener主要系GB28181注册、心跳、DevicePosition等如注册成功、注册超时、注册网络传输层错误、心跳异常、设备位置请求处理
public interface GBSIPAgentListener
{/*注册成功* param dateString: 服务器日期用来校准设备端时间用户自行决定是否校准设备时间*/void ntsRegisterOK(String dateString);/**注册超时*/void ntsRegisterTimeout();/**注册网络传输层异常*/void ntsRegisterTransportError(String errorInfo);/**心跳达到异常次数*/void ntsOnHeartBeatException(int exceptionCount, String lastExceptionInfo);/** 设备位置请求, 这个主要用在移动设备位置订阅上* param interval 请求间隔, 单位是毫秒*/void ntsOnDevicePositionRequest(String deviceId, int interval);
}
GBSIPAgentPlayListener主要系GB28181的Invite、Ack、Bye等处理
public interface GBSIPAgentPlayListener {/**收到sPlay的实时视音频点播*/void ntsOnInvitePlay(String deviceId, SessionDescription sessionDescription);/**发送play invite response 异常*/void ntsOnPlayInviteResponseException(String deviceId, int statusCode, String errorInfo);/** 收到CANCEL play INVITE请求*/void ntsOnCancelPlay(String deviceId);/** 收到Ack*/void ntsOnAckPlay(String deviceId);/** 收到Bye*/void ntsOnByePlay(String deviceId);/** 不是在收到BYE Message情况下 终止Play*/void ntsOnTerminatePlay(String deviceId);/** Play会话对应的对话终止, 一般不会出发这个回调,目前只有在响应了200K, 但在64*T1时间后还没收到ACK,才可能会出发收到这个, 请做相关清理处理*/void ntsOnPlayDialogTerminated(String deviceId);
}
GBSIPAgentAudioBroadcastListener主要系GB28181语音广播处理相关如有语音广播相关需求可参照demo实例实现
public interface GBSIPAgentAudioBroadcastListener {/**收到语音广播通知*/void ntsOnNotifyBroadcastCommand(String fromUserName, String fromUserNameAtDomain, String sn, String sourceID, String targetID);/**需要准备接受语音广播的SDP内容*/void ntsOnAudioBroadcast(String commandFromUserName, String commandFromUserNameAtDomain, String sourceID, String targetID);/**音频广播, 发送Invite请求异常*/void ntsOnInviteAudioBroadcastException(String sourceID, String targetID, String errorInfo);/**音频广播, 等待Invite响应超时*/void ntsOnInviteAudioBroadcastTimeout(String sourceID, String targetID);/**音频广播, 收到Invite消息最终响应*/void ntsOnInviteAudioBroadcastResponse(String sourceID, String targetID, int statusCode, SessionDescription sessionDescription);/** 音频广播, 收到BYE Message*/void ntsOnByeAudioBroadcast(String sourceID, String targetID);/** 不是在收到BYE Message情况下 终止音频广播*/void ntsOnTerminateAudioBroadcast(String sourceID, String targetID);
}
GBSIPAgentDeviceControlListener主要系GB28181设备控制相关比如远程启动、云台控制
public interface GBSIPAgentDeviceControlListener {/** 收到远程启动控制命令*/void ntsOnDeviceControlTeleBootCommand(String deviceId, String teleBootValue);/** 云台控制*/void ntsOnDeviceControlPTZCmd(String deviceId, String typeValue);
} GBSIPAgentQueryCommandListener主要系GB28181查询命令如预置位查询
public interface GBSIPAgentQueryCommandListener {/** 设备预置位查询*/void ntsOnDevicePresetQueryCommand(String fromUserName, String fromUserNameAtDomain, String sn, String deviceId);
}
GBSIPAgentTalkListener主要系GB28181语音对讲相关处理
public interface GBSIPAgentTalkListener {/**收到sTalk 语音对讲*/void ntsOnInviteTalk(String deviceId, SessionDescription sessionDescription);/**发送talk invite response 异常*/void ntsOnTalkInviteResponseException(String deviceId, int statusCode, String errorInfo);/** 收到CANCEL Talk INVITE请求*/void ntsOnCancelTalk(String deviceId);/** 收到Ack*/void ntsOnAckTalk(String deviceId);/** 收到Bye*/void ntsOnByeTalk(String deviceId);/** 不是在收到BYE Message情况下 终止Talk*/void ntsOnTerminateTalk(String deviceId);/** Talk会话对应的对话终止, 一般不会出发这个回调,目前只有在响应了200K, 但在64*T1时间后还没收到ACK,才可能会出发收到这个, 请做相关清理处理*/void ntsOnTalkDialogTerminated(String deviceId);
}
媒体数据处理
RTP数据发送
RTP SenderSmartPublisherJniV2.java相关接口设计
/** SmartPublisherJniV2.java* Author: https://daniusdk.com*/
/** 创建RTP Sender实例** param reserve保留参数传0** return RTP Sender 句柄0表示失败*/
public native long CreateRTPSender(int reserve);/***设置 RTP Sender传输协议** param rtp_sender_handle, CreateRTPSender返回值* param transport_protocol, 0:UDP, 1:TCP, 默认是UDP** return {0} if successful*/
public native int SetRTPSenderTransportProtocol(long rtp_sender_handle, int transport_protocol);/***设置 RTP Sender IP地址类型** param rtp_sender_handle, CreateRTPSender返回值* param ip_address_type, 0:IPV4, 1:IPV6, 默认是IPV4, 当前仅支持IPV4** return {0} if successful*/
public native int SetRTPSenderIPAddressType(long rtp_sender_handle, int ip_address_type);/***设置 RTP Sender RTP Socket本地端口** param rtp_sender_handle, CreateRTPSender返回值* param port, 必须是偶数设置0的话SDK会自动分配, 默认值是0** return {0} if successful*/
public native int SetRTPSenderLocalPort(long rtp_sender_handle, int port);/***设置 RTP Sender SSRC** param rtp_sender_handle, CreateRTPSender返回值* param ssrc, 如果设置的话这个字符串要能转换成uint32类型, 否则设置失败** return {0} if successful*/
public native int SetRTPSenderSSRC(long rtp_sender_handle, String ssrc);/***设置 RTP Sender RTP socket 发送Buffer大小** param rtp_sender_handle, CreateRTPSender返回值* param buffer_size, 必须大于0, 默认是512*1024, 当前仅对UDP socket有效, 根据视频码率考虑设置合适的值** return {0} if successful*/
public native int SetRTPSenderSocketSendBuffer(long rtp_sender_handle, int buffer_size);/***设置 RTP Sender RTP时间戳时钟频率** param rtp_sender_handle, CreateRTPSender返回值* param clock_rate, 必须大于0, 对于GB28181 PS规定是90kHz, 也就是90000** return {0} if successful*/
public native int SetRTPSenderClockRate(long rtp_sender_handle, int clock_rate);/***设置 RTP Sender 目的IP地址, 注意当前用在GB2818推送上,只设置一个地址,将来扩展如果用在其他地方可能要设置多个目的地址到时候接口可能会调整** param rtp_sender_handle, CreateRTPSender返回值* param address, IP地址* param port, 端口** return {0} if successful*/
public native int SetRTPSenderDestination(long rtp_sender_handle, String address, int port);/*** 设置是否开启 RTP Receiver* param rtp_sender_handle, CreateRTPSender返回值* param is_enable, 0表示不收RTP包, 1表示收RTP包, SDK默认值为0.* return*/
public native int EnableRTPSenderReceive(long rtp_sender_handle, int is_enable);/***设置RTP Receiver SSRC** param rtp_sender_handle, CreateRTPSender返回值* param ssrc, 如果设置的话这个字符串要能转换成uint32类型, 否则设置失败** return {0} if successful*/
public native int SetRTPSenderReceiveSSRC(long rtp_sender_handle, String ssrc);/***设置RTP Receiver Payload 相关信息** param rtp_sender_handle, CreateRTPSender返回值** param payload_type, 请参考 RFC 3551** param encoding_name, 编码名, 请参考 RFC 3551, 如果payload_type不是动态的, 可能传null就好** param media_type, 媒体类型, 请参考 RFC 3551, 1 是视频, 2是音频** param clock_rate, 请参考 RFC 3551** return {0} if successful*/
public native int SetRTPSenderReceivePayloadType(long rtp_sender_handle, int payload_type, String encoding_name, int media_type, int clock_rate);/***设置RTP Receiver PS的pts和dts clock frequency** param rtp_sender_handle, CreateRTPSender返回值** param ps_clock_frequency, 默认是90000, 一些特殊场景需要设置** return {0} if successful*/
public native int SetRTPSenderReceivePSClockFrequency(long rtp_sender_handle, int ps_clock_frequency);/***设置 RTP Receiver 音频采样率** param rtp_sender_handle, CreateRTPSender返回值* param sampling_rate, 音频采样率** return {0} if successful*/
public native int SetRTPSenderReceiveAudioSamplingRate(long rtp_sender_handle, int sampling_rate);/***设置 RTP Receiver 音频通道数** param rtp_sender_handle, CreateRTPSender返回值* param channels, 音频通道数** return {0} if successful*/
public native int SetRTPSenderReceiveAudioChannels(long rtp_sender_handle, int channels);/***初始化RTP Sender, 初始化之前先调用上面的接口配置相关参数** param rtp_sender_handle, CreateRTPSender返回值** return {0} if successful*/
public native int InitRTPSender(long rtp_sender_handle);/***获取RTP Sender RTP Socket本地端口** param rtp_sender_handle, CreateRTPSender返回值** return 失败返回0, 成功的话返回响应的端口, 请在InitRTPSender返回成功之后调用*/
public native int GetRTPSenderLocalPort(long rtp_sender_handle);/*** UnInit RTP Sender** param rtp_sender_handle, CreateRTPSender返回值** return {0} if successful*/
public native int UnInitRTPSender(long rtp_sender_handle);/*** 释放RTP Sender, 释放之后rtp_sender_handle就无效了请不要再使用** param rtp_sender_handle, CreateRTPSender返回值** return {0} if successful*/
public native int DestoryRTPSender(long rtp_sender_handle);
RTP数据接收
对应RTP ReceiverSmartPlayerJniV2.java相关接口设计如无语音广播或语音对讲相关技术需求这部分可忽略
/** SmartPlayerJniV2.java* Author: https://daniusdk.com*/
/** 创建RTP Receiver** param reserve保留参数传0** return RTP Receiver 句柄0表示失败*/
public native long CreateRTPReceiver(int reserve);/***设置 RTP Receiver传输协议** param rtp_receiver_handle, CreateRTPReceiver* param transport_protocol, 0:UDP, 1:TCP, 默认是UDP** return {0} if successful*/
public native int SetRTPReceiverTransportProtocol(long rtp_receiver_handle, int transport_protocol);/***设置 RTP Receiver IP地址类型** param rtp_receiver_handle, CreateRTPReceiver* param ip_address_type, 0:IPV4, 1:IPV6, 默认是IPV4** return {0} if successful*/
public native int SetRTPReceiverIPAddressType(long rtp_receiver_handle, int ip_address_type);/***设置 RTP Receiver RTP Socket本地端口** param rtp_receiver_handle, CreateRTPReceiver* param port, 必须是偶数设置0的话SDK会自动分配, 默认值是0** return {0} if successful*/
public native int SetRTPReceiverLocalPort(long rtp_receiver_handle, int port);/***设置 RTP Receiver SSRC** param rtp_receiver_handle, CreateRTPReceiver* param ssrc, 如果设置的话这个字符串要能转换成uint32类型, 否则设置失败** return {0} if successful*/
public native int SetRTPReceiverSSRC(long rtp_receiver_handle, String ssrc);/***创建 RTP Receiver 会话** param rtp_receiver_handle, CreateRTPReceiver* param reserve, 保留值目前传0** return {0} if successful*/
public native int CreateRTPReceiverSession(long rtp_receiver_handle, int reserve);/***获取 RTP Receiver RTP Socket本地端口** param rtp_receiver_handle, CreateRTPReceiver** return 失败返回0, 成功的话返回响应的端口, 请在CreateRTPReceiverSession返回成功之后调用*/
public native int GetRTPReceiverLocalPort(long rtp_receiver_handle);/***设置 RTP Receiver Payload 相关信息** param rtp_receiver_handle, CreateRTPReceiver** param payload_type, 请参考 RFC 3551** param encoding_name, 编码名, 请参考 RFC 3551, 如果payload_type不是动态的, 可能传null就好** param media_type, 媒体类型, 请参考 RFC 3551, 1 是视频, 2是音频** param clock_rate, 请参考 RFC 3551** return {0} if successful*/
public native int SetRTPReceiverPayloadType(long rtp_receiver_handle, int payload_type, String encoding_name, int media_type, int clock_rate);/***设置 RTP Receiver 音频采样率** param rtp_receiver_handle, CreateRTPReceiver* param sampling_rate, 音频采样率** return {0} if successful*/
public native int SetRTPReceiverAudioSamplingRate(long rtp_receiver_handle, int sampling_rate);/***设置 RTP Receiver 音频通道数** param rtp_receiver_handle, CreateRTPReceiver* param channels, 音频通道数** return {0} if successful*/
public native int SetRTPReceiverAudioChannels(long rtp_receiver_handle, int channels);/***设置 RTP Receiver 远端地址** param rtp_receiver_handle, CreateRTPReceiver* param address, IP地址* param port, 端口** return {0} if successful*/
public native int SetRTPReceiverRemoteAddress(long rtp_receiver_handle, String address, int port);/***初始化 RTP Receiver** param rtp_receiver_handle, CreateRTPReceiver** return {0} if successful*/
public native int InitRTPReceiver(long rtp_receiver_handle);/***UnInit RTP Receiver** param rtp_receiver_handle, CreateRTPReceiver** return {0} if successful*/
public native int UnInitRTPReceiver(long rtp_receiver_handle);/***Destory RTP Receiver Session** param rtp_receiver_handle, CreateRTPReceiver** return {0} if successful*/
public native int DestoryRTPReceiverSession(long rtp_receiver_handle);/***Destory RTP Receiver** param rtp_receiver_handle, CreateRTPReceiver** return {0} if successful*/
public native int DestoryRTPReceiver(long rtp_receiver_handle);
PostAudioPacketSmartPlayerJniV2.java,投递音频包给外部Live source目前仅于语音对讲使用
/** SmartPlayerJniV2.java* Author: https://daniusdk.com*/
/*** 投递音频包给外部Live source, 注意ByteBuffer对象必须是DirectBuffer** param handle: return value from SmartPlayerOpen()** return {0} if successful*/
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相关接口调用相关设计如下
/** SmartPublisherJniV2.java* Author: https://daniusdk.com*/
/*** 设置GB28181 RTP Sender** param rtp_sender_handle, CreateRTPSender返回值* param rtp_payload_type, 对于GB28181 PS, 协议定义是96, 具体以SDP为准, RFC 3551有定义* param encoding_name, 编码名, 请参考 RFC 3551, 当前仅支持: PS, 其他值返回失败* return {0} if successful*/
public native int SetGB28181RTPSender(long handle, long rtp_sender_handle, int rtp_payload_type, String encoding_name);/*** 设置GB28181 RTP 收到的音频包回调* param handle* param audio_packet_callback* return*/
public native int SetGB28181ReceiveAudioPacketCallback(long handle, NTAudioPacketCallback audio_packet_callback);/*** 启动 GB28181 媒体流** return {0} if successful*/
public native int StartGB28181MediaStream(long handle);/*** 停止 GB28181 媒体流** return {0} if successful*/
public native int StopGB28181MediaStream(long handle);
总结
以上是大牛直播SDK关于Android平台GB28181设备接入模块执法记录仪相关技术方案除了基础功能外GB28181模块还可以实现实时音量调节、实时快照、按需录像、历史视音频下载、历史视音频回放等感兴趣的开发者可以尝试看看。