Регистраторы для правоохранительных органов GB28181 широко используются в правоохранительных органах, таких как общественная безопасность, дорожная полиция и городское управление, а также в таких отраслях, как железные дороги, электроэнергетика и водное хозяйство. В правоохранительных органах, обеспечивающих общественную безопасность, записывающие устройства правоохранительных органов могут записывать процесс правоохранительных органов в режиме реального времени и загружать их в командный центр, предоставляя убедительные доказательства для рассмотрения дел. При проверках на железных дорогах записывающие устройства правоохранительных органов могут передавать аудио- и видеоданные с места проверки; в командный центр в режиме реального времени, осуществляя удаленный мониторинг и диспетчеризацию.
У многих разработчиков возникает этот вопрос. Первые записывающие устройства правоохранительных органов либо имели частные протоколы, либо использовали передачу RTP или RTMP. Почему все записывающие устройства правоохранительных органов в настоящее время используют GB28181? Причина, по которой регистраторы правоохранительных органов используют протокол GB28181, связана с различными соображениями, такими как стандартизация и совместимость, эффективная передача данных и контроль, снижение сложности и стоимости системы, увеличение широты сценариев применения и обеспечение безопасности данных и защиты конфиденциальности:
GB28181 — это национальный стандарт моей страны для сетевых систем видеонаблюдения общественной безопасности (GB/T 28181-2016 «Технические требования к передаче, обмену и управлению сетевыми системами видеонаблюдения общественной безопасности»). Он определяет структуру межсоединений, передачу и параметры связи. обмен системами видеонаблюдения, основные требования к контролю и требованиям безопасности, а также технические требования, такие как управление, процессы передачи и интерфейсы протоколов. Принятие протокола GB28181 может обеспечить беспрепятственное соединение рекордера правоохранительных органов с другими устройствами или системами, которые соответствуют этому стандарту, для достижения информационной взаимосвязи и совместимости, что значительно повышает уровень совместимости и стандартизации системы.
Протокол GB28181 поддерживает передачу видеоданных на основе протокола TCP/IP, что обеспечивает надежность и согласованность данных. В то же время он также добавляет механизмы аутентификации, шифрования и контроля доступа для обеспечения безопасности системы. Благодаря протоколу GB28181 записывающее устройство для правоохранительных органов может осуществлять передачу и удаленный мониторинг видеоданных в реальном времени, повышая эффективность передачи данных и возможности управления.
Если записывающее устройство правоохранительных органов не поддерживает протокол GB28181, возможно, ему придется использовать SDK записывающего устройства для вторичной разработки во время системной интеграции, что увеличит сложность и стоимость разработки системы. Использование записывающих устройств правоохранительных органов, поддерживающих протокол GB28181, можно напрямую зарегистрировать на существующей платформе GB28181 для обеспечения удаленного просмотра, внутренней связи и других функций без необходимости инвестиций в отдельную системную платформу, что снижает затраты на интеграцию, эксплуатацию и обслуживание системы. .
Протокол GB28181 обладает хорошей масштабируемостью и легко интегрируется с другими системами. Например, его можно связать с системами сигнализации, системами контроля доступа и т. д. для достижения более интеллектуального управления безопасностью. Это означает, что регистраторы правоохранительных органов имеют более широкие перспективы применения в сфере общественной безопасности, городского управления, государственного надзора и других областях. В то же время, по мере постоянного развития технологий Интернета вещей, все больше и больше устройств будут поддерживать протокол GB28181, а сценарии применения будут становиться все более обширными.
Протокол GB28181 добавляет такие механизмы, как аутентификация безопасности, шифрование и контроль доступа во время процесса передачи данных. Эти механизмы могут эффективно защитить безопасность и конфиденциальность передаваемых данных. Для таких устройств, как нательные камеры, которые записывают конфиденциальную информацию, крайне важно обеспечить безопасность данных и защиту конфиденциальности.
В качестве примера в этой статье используется SDK для доступа к устройствам Android GB28181 (SmartGBD) от Daniu Live SDK.
Тип стыковки данных
Поддержка функций
Если взять в качестве примера док-станцию Camera2 для платформы Android, то сигнальная часть должна реализовать следующий интерфейс, отмеченный красным:
public class MainActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener, Camera2Listener,
GBSIPAgentListener, GBSIPAgentPlayListener, GBSIPAgentAudioBroadcastListener,
GBSIPAgentDeviceControlListener, GBSIPAgentQueryCommandListener,
GBSIPAgentTalkListener,
GBSIPAgentQueryRecordInfoListener{
}
Обработка медиаданныхинтерфейс,Пожалуйста, обратитесь к 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:
public interface GBSIPAgentPlayListener {
/*
*Получайте видео и аудио в реальном времени по запросу от s=Play.
*/
void ntsOnInvitePlay(String deviceId, SessionDescription sessionDescription);
/*
*Отправить игру invite response аномальный
*/
void ntsOnPlayInviteResponseException(String deviceId, int statusCode, String errorInfo);
/*
* ОТМЕНА получено play ПРИГЛАСИТЕ запрос
*/
void ntsOnCancelPlay(String deviceId);
/*
* Подтверждение получено
*/
void ntsOnAckPlay(String deviceId);
/*
* Получено до свидания
*/
void ntsOnByePlay(String deviceId);
/*
* Не получаю ПОКА В случае сообщения Прекратить игру
*/
void ntsOnTerminatePlay(String deviceId);
/*
* Разговор, соответствующий сеансу Play, завершается, Обычно этот обратный вызов не запускается. В настоящее время он отвечает только на 200 КБ. Но если вы не получили ACK по истечении времени 64*T1, вы можете начинать.
получил это, Пожалуйста, сделайте соответствующую очистку
*/
void ntsOnPlayDialogTerminated(String deviceId);
}
GBSIPAgentAudioBroadcastListener в основном связан с обработкой голосового вещания GB28181. Если у вас есть потребности, связанные с голосовым вещанием, вы можете обратиться к демонстрационному примеру для реализации:
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);
/*
*аудиотрансляция, Отправить запрос на приглашение
*/
void ntsOnInviteAudioBroadcastException(String sourceID, String targetID, String errorInfo);
/*
*аудиотрансляция, Тайм-аут ожидания ответа на приглашение
*/
void ntsOnInviteAudioBroadcastTimeout(String sourceID, String targetID);
/*
*аудиотрансляция, Получите окончательный ответ на приглашение
*/
void ntsOnInviteAudioBroadcastResponse(String sourceID, String targetID, int statusCode, SessionDescription sessionDescription);
/*
* аудиотрансляция, ПОКА получено Message
*/
void ntsOnByeAudioBroadcast(String sourceID, String targetID);
/*
* Не получаю ПОКА В случае сообщения Завершить аудиотрансляцию
*/
void ntsOnTerminateAudioBroadcast(String sourceID, String targetID);
}
GBSIPAgentDeviceControlListener в основном связан с управлением устройством GB28181, таким как удаленный запуск и управление PTZ:
public interface GBSIPAgentDeviceControlListener {
/*
* Получена команда управления дистанционным запуском
*/
void ntsOnDeviceControlTeleBootCommand(String deviceId, String teleBootValue);
/*
* PTZ-управление
*/
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 {
/*
*Получено s=Обсуждение Голосовой домофон
*/
void ntsOnInviteTalk(String deviceId, SessionDescription sessionDescription);
/*
*Отправить разговор invite response аномальный
*/
void ntsOnTalkInviteResponseException(String deviceId, int statusCode, String errorInfo);
/*
* ОТМЕНА получено Talk ПРИГЛАСИТЕ запрос
*/
void ntsOnCancelTalk(String deviceId);
/*
* Подтверждение получено
*/
void ntsOnAckTalk(String deviceId);
/*
* Получено до свидания
*/
void ntsOnByeTalk(String deviceId);
/*
* Не получаю ПОКА В случае сообщения Завершить разговор
*/
void ntsOnTerminateTalk(String deviceId);
/*
* Разговор, соответствующий сеансу разговора, завершается, Обычно этот обратный вызов не запускается. В настоящее время он отвечает только на 200 КБ. Но если вы не получили ACK по истечении времени 64*T1, вы можете начинать.
получил это, Пожалуйста, сделайте соответствующую очистку
*/
void ntsOnTalkDialogTerminated(String deviceId);
}
GBSIPAgentPlaybackListener связан с историческим воспроизведением видео и аудио:
public interface GBSIPAgentPlaybackListener {
void ntsOnInvitePlayback(long var1, String var3, SessionDescription var4);
void ntsOnPlaybackInviteResponseException(long var1, String var3, int var4, String var5);
void ntsOnCancelPlayback(long var1, String var3);
void ntsOnAckPlayback(long var1, String var3);
void ntsOnPlaybackMANSRTSPPlayCommand(long var1, String var3);
void ntsOnPlaybackMANSRTSPPauseCommand(long var1, String var3);
void ntsOnPlaybackMANSRTSPScaleCommand(long var1, String var3, double var4);
void ntsOnPlaybackMANSRTSPSeekCommand(long var1, String var3, double var4);
void ntsOnPlaybackMANSRTSPTeardownCommand(long var1, String var3);
void ntsOnByePlayback(long var1, String var3);
void ntsOnTerminatePlayback(long var1, String var3);
void ntsOnPlaybackDialogTerminated(long var1, String var3);
}
GBSIPAgentDownloadListen относится к историческим загрузкам видео и аудио:
public interface GBSIPAgentDownloadListener {
void ntsOnInviteDownload(long var1, String var3, SessionDescription var4);
void ntsOnDownloadInviteResponseException(long var1, String var3, int var4, String var5);
void ntsOnCancelDownload(long var1, String var3);
void ntsOnAckDownload(long var1, String var3);
void ntsOnDownloadMANSRTSPScaleCommand(long var1, String var3, double var4);
void ntsOnByeDownload(long var1, String var3);
void ntsOnTerminateDownload(long var1, String var3);
void ntsOnDownloadDialogTerminated(long var1, String var3);
}
Дизайн интерфейса, связанного с RTP Sender (SmartPublisherJniV2.java):
/*
* SmartPublisherJniV2.java
* Author: https://daniusdk.com
* WeChat:xinsheng120
*/
/*
* Создать RTP Экземпляр отправителя
*
* @param резерв: передайте 0, чтобы зарезервировать параметры
*
* @return RTP Sender Дескриптор, 0 указывает на сбой
*/
public native long CreateRTPSender(int reserve);
/**
*настраивать RTP Транспортный протокол отправителя
*
* @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 Локальный порт сокета
*
* @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 Размер буфера отправки
*
* @param rtp_sender_handle, Возвращаемое значение CreateRTPSender
* @param buffer_size, Должно быть больше 0, По умолчанию — 512*1024, Пока только для UDP сокет действителен, Рассмотрите возможность установки соответствующих значений в зависимости от скорости передачи видео.
*
* @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 составляет 90 к Гц, это 90000
*
* @return {0} if successful
*/
public native int SetRTPSenderClockRate(long rtp_sender_handle, int clock_rate);
/**
*настраивать RTP Sender IP-адрес назначения, Обратите внимание, что в настоящее время он используется для push-уведомлений 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 не является динамическим, Может быть, просто передать ноль
*
* @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 P.S. баллы и баллы 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);
/**
* Получить РТП Sender RTP Локальный порт сокета
*
* @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 (SmartPlayerJniV2.java), если нет технических требований, связанных с голосовым вещанием или голосовой внутренней связью, эту часть можно игнорировать:
/*
* SmartPlayerJniV2.java
* Author: https://daniusdk.com
* WeChat: xinsheng120
*/
/*
* Создать RTP Receiver
*
* @param резерв: передайте 0, чтобы зарезервировать параметры
*
* @return RTP Receiver Дескриптор, 0 указывает на сбой
*/
public native long CreateRTPReceiver(int reserve);
/**
*настраивать RTP Транспортный протокол приемника
*
* @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 Локальный порт сокета
*
* @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 Локальный порт сокета
*
* @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 не является динамическим, Может быть, просто передать ноль
*
* @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);
PostAudioPacket (SmartPlayerJniV2.java) доставляет аудиопакеты на внешние источники Live, в настоящее время используется только для голосовой связи:
/*
* 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
* WeChat: xinsheng120
*/
/**
* Настройка 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);
Решение GB28181 в сфере записывающих устройств для правоохранительных органов обеспечивает более комплексное решение для правоохранительных органов за счет объединения оборудования, передачи и хранения данных в реальном времени, удаленного мониторинга и управления, интеллектуального анализа, безопасности и защиты конфиденциальности и других аспектов. и безопасная техническая поддержка. Реализация этих решений не только повышает эффективность правоохранительных органов, но и повышает общественную безопасность. Регистратор для правоохранительных органов GB28181 играет важную роль в области записи и удаленного мониторинга правоохранительных органов благодаря своим эффективным, стабильным и безопасным техническим характеристикам. Благодаря постоянному развитию технологий и постоянному расширению сценариев применения регистраторы GB28181 для правоохранительных органов будут продолжать оказывать мощную поддержку общественной безопасности и социального управления. Вышеупомянутое представляет собой техническое исследование рекордера для правоохранительных органов GB28181. Заинтересованные разработчики могут связаться со мной индивидуально для обсуждения.