Когда многие разработчики выбирают технологические решения для передачи видео на стороне устройства, такие как записывающие устройства для правоохранительных органов, интеллектуальные шлемы и интеллектуальное наблюдение, они не знают, использовать ли RTSP, RTMP или GB28181. Они относительно незнакомы с GB28181, поэтому мы будем использовать их. следуйте спецификации GB28181. Давайте обсудим необходимость:
Процесс взаимодействия сигнализации в спецификации GB28181 в основном включает в себя регистрацию, поддержание активности, запрос информации об устройстве, предварительный просмотр видео в реальном времени и т. д., а именно:
REGISTER
запросить сообщение。В этом сообщении содержится основная информация об устройстве.,Например, оборудование ID、IP-адрес、порт Число、Тип оборудования и т. д.,и запрошенный срок действия(expires
Поле)и другая информация。401 Unauthorized
ответ,要求下级设备существоватьназад续из注册просить中нести认证信息。401
Ответ содержит параметры, необходимые для аутентификации.,Например, домен аутентификации(realm
)、случайное число(nonce
)ждать。REGISTER
Добавьте данные аутентификации в запрос,Обычно используется дайджест-аутентификация.,计算出ответценить(response
)и добавить к запросу。Информация аутентификации включает имя пользователя.、пароль、случайное число、Метод запрос, запрос URI Суммарная стоимость прочей информации.200 OK
ответ,Указывает на успешную регистрацию,в то же времясуществоватьответ中可以包含注册из有效期(expires
Поле)и другая информация。Платформа верхнего уровня будет записывать информацию устройств нижнего уровня.,для последующего управления и контроля.MESSAGE
метод,并существоватьв теле сообщениянести保活命令(cmdtype="keepalive"
)和设备状态и другая информация。200 OK
ответ,Указывает на подтверждение получения контрольной информации.GB28181 Процесс в спецификациях предварительного просмотра видео в реальном время в основном включает в себя следующие этапы:
INVITE
просить。просить中包含медиапотокописание информации,Например, формат кодирования видео, разрешение, частота кадров и т. д.,и адрес для получения видеопотока ипорт Числои другая информация。существовать消息头域中通常会нестиsubject
Поле,Указывает источник видео по запросу. Идентификатор, порядковый номер медиапотока отправителя, получатель медиапотока ID、принимающая сторонамедиапоток序列Числождать参数。Например,SDP
в теле сообщенияs
Поле为 “play” Представляет собой режим реального времени по требованию.INVITE
проситьназад,Начать работу по маршрутизации и пересылке сигналов. Он будет использовать информацию о целевом устройстве в запросе.,Перенаправить запрос в сетевой домен соответствующего устройства нижнего уровня или непосредственно на устройство нижнего уровня.INVITE
просить,此просить不нестиSDP
тело сообщения,Цель состоит в том, чтобы уведомить медиасервер о необходимости подготовиться к приему.медиапоток。INVITE
проситьназад,отвечать200 OK
ответ,нестиSDP
тело сообщения。в теле сообщения描述了媒体服务器接收медиапотокиз IP, порт, формат мультимедиа и т. д., чтобы устройство нижнего уровня могло правильно отправлять медиапоток на медиасервер.200 OK
ответназад,Воля该ответв теле сообщенияиз Сопутствующая информация添加到新изINVITE
просить中,并отправлять给下级设备(медиапотокотправлять者)。这个просить中изs
Поле同样为 “play” Представляет собой по требованию в реальном времени,и увеличитьy
Поле描述同步源(SSRC)ценить,f
Поле描述媒体参数ждать,告知下级设备К媒体服务器отправлятьмедиапотокиз具体要求。INVITE
проситьназад,отвечать200 OK
ответ,нестиSDP
тело сообщения,в теле сообщения描述了下级设备отправлятьмедиапотокиз IP, порт, медиаформат, SSRC поля и другое содержимое, указывающее, что устройство нижнего уровня готово отправлять медиапотоки.200 OK
ответназад,КОтвет с превосходной сообщение с подтверждением платформы,Сообщите превосходящей платформемедиапотокиз传输路径已经建立。上级平台收到Подтвердите сообщениеназад,Начните готовиться к получениюмедиапоток。ACK
просить,просить中нести下级设备отвечатьиз200 OK
ответтело сообщения,完成与媒体СервераINVITE
сессиянастроить процесс。в то же время,SIP 服务器也К下级设备отправлятьACK
просить,Запрос не содержит тела сообщения,完成与下级设备изINVITE
сессиянастроить процесс。До сих пор,三方из媒体сессия Соединение установлено,медиапоток Можно начать передачу。BYE
просить,уведомить SIP Сервер остановил передачу видео.BYE
проситьназадотвечать200 OK
ответ,сессияотключиться。然назад,SIP 服务器分别К媒体服务器和下级设备отправлятьBYE
просить,уведомить它们结束медиапотокиз传输。BYE
проситьназад,分别отвечать200 OK
ответ,сессияотключиться,Весь процесс предварительного просмотра видео в реальном время закончилось.В этой статье в качестве примера используется модуль доступа к устройству GB28181 платформы Android из Daniu Live SDK, чтобы показать, как реализовать и подключить устройство GB28181.
Помимо поддержки обычного доступа к аудио- и видеоданным, терминалы Android также могут поддерживать подписку и уведомление о местонахождении мобильного устройства (MobilePosition), захват изображений, голосовую трансляцию и голосовую внутреннюю связь, загрузку и воспроизведение исторического видео и аудио, а поддерживаемые типы данных стыковки: следующее:
Если взять в качестве примера док-станцию Camera2 для платформы Android, то сигнальная часть должна реализовать следующий интерфейс, отмеченный красным:
/*
* MainActivity.java
* Author: daniusdk.com
* WeChat: xinsheng120
*/
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);
/*
*аудиотрансляция, отправлятьInviteпроситьаномальный
*/
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, выглядит следующим образом:
/*
* 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 теперь доступна в версии 2022 года. Поскольку влияние и область применения спецификации в отрасли увеличиваются, предполагается, что появятся итеративные версии, такие как 2026 и 2030 годы. Наши прогнозируемые тенденции развития GB28181 могут заключаться в следующих аспектах. , желающие также могут обсудить со мной индивидуально: