Запустите облегченную службу RTSP на Android, позволяющую терминалу Android предоставлять внешнюю службу для потоковой передачи RTSP, например веб-камеру. Это очень подходит для сценариев, в которых параллельная работа в интрасети невелика и вы не хотите развертывать отдельную службу потоковой передачи. Терминал Android. Для реализации такой службы потокового мультимедиа решено, что это может быть только облегченная служба. Эта функциональность может быть достигнута путем интеграции сторонних библиотек или написания собственного кода RTSP-сервера.
Сегодня мы представляем два решения: одно — GStreamer, а другое — SmartRtspServer из Daniu Live SDK.
Использование GStreamer для запуска служб RTSP на платформе Android включает в себя несколько ключевых шагов, включая настройку среды GStreamer, написание конвейера GStreamer и его интеграцию в приложение Android.
Конвейер GStreamer определяет поток обработки медиаданных. Для обслуживания RTSP вам необходимо создать конвейер, который может захватывать мультимедиа (например, видео с камеры), кодировать его и отправлять через сервер RTSP, функции GStreamer.
Базовый пример кода конвейера сервера RTSP выглядит следующим образом:
GstElement *pipeline, *src, *enc, *sink;
/* ИнициализироватьGStreamer */
gst_init(NULL, NULL);
/* Создать конвейер */
pipeline = gst_parse_launch("videotestsrc ! videoconvert ! x264enc ! rtph264pay name=pay0 pt=96", NULL);
/* Установите адрес и порт RTSP-сервера */
g_object_set(G_OBJECT(pay0), "server-port", 8554, NULL);
/* Запустить конвейер */
gst_element_set_state(pipeline, GST_STATE_PLAYING);
/* ...(Другой код, такой как обработка ошибок, очистка и т. д.)... */
Теперь, когда у вас есть код для вашего конвейера GStreamer, вам необходимо интегрировать его в свое приложение для Android:
Activity
илиService
позвонитьJNIфункционировать, чтобы ИнициализироватьGStreamerи настраиваем трубопровод。appsrc
элемент(если применимо)отAndroidКамера захватывает видеокадры,и отправить его в конвейер GStreamer.onPause
、onResume
、onDestroy
)Остановитесь и начните правильно вGStreamer。Ниже приведен SmartRtspServer из Daniu Live SDK. В отличие от GStreamer, SmartRtspServer имеет более полные функции, более высокую стабильность и коммерциализацию. Логика реализации следующая:
Встроенный в Android облегченный сервисный модуль RTSP Дизайн интерфейса | ||
---|---|---|
описание звонка | интерфейс | интерфейсописывать |
SmartRTSPServerSDK | ||
Инициализировать RTSP-сервер | InitRtspServer | Init rtsp-сервер (в сочетании с UnInitRtspServer, даже если запущено несколько служб RTSP, InitRtspServer нужно вызвать только один раз, обязательно вызывайте его перед OpenRtspServer) |
Создать rtsp-сервер | OpenRtspServer | Создать rtsp-сервер, вернуть rtsp дескриптор сервера |
Установить порт | SetRtspServerPort | setrtsp server порт прослушивания, Требуется установка перед StartRtspServer порт |
Установите имя пользователя и пароль для аутентификации | SetRtspServerUserNamePassword | setrtsp server Имя пользователя и пароль для аутентификации, Это не обязательно устанавливать, задавайте только в том случае, если требуется аутентификация. |
Получить текущий номер сеанса rtsp-сервера | GetRtspServerClientSessionNumbers | getrtsp Текущее количество клиентских сессий на сервере, Этот интерфейс должен вызываться после StartRtspServer. |
Запустить rtsp-сервер | StartRtspServer | Запустить rtsp-сервер |
остановить rtsp-сервер | StopRtspServer | остановить rtsp-сервер |
Закрыть rtsp-сервер | CloseRtspServer | Закрыть rtsp-сервер |
UnInit rtsp server | UnInitRtspServer | Сервер UnInit rtsp (в сочетании с InitRtspServer, даже если запущено несколько служб RTSP, UnInitRtspServer необходимо вызвать только один раз) |
SmartRTSPServerSDK используется издателем для вызова | ||
имя потока setrtsp | SetRtspStreamName | имя потока setrtsp |
Setrtsp для публикации потока rtsp server | AddRtspStreamServer | Setrtsp для публикации потока rtsp server, Поток может быть опубликован на нескольких rtps. На сервере rtsp Чтобы создать и запустить сервер, обратитесь к интерфейсам OpenRtspServer и StartRtspServer. |
Очистите установленный rtsp-сервер | ClearRtspStreamServer | Очистите установленный rtsp-сервер |
startrtspпоток | StartRtspStream | startrtspпоток |
стоппрсппоток | StopRtspStream | стоппрсппоток |
В качестве примера возьмем коллекцию камер SmartRtspServer. Сначала инициализируйте RTSP-сервер:
/*
* MainActivity.java
* Author: daniusdk.com
* WeChat:xinsheng120
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
context_ = this.getApplicationContext();
libPublisher = new SmartPublisherJniV2();
libPublisher.InitRtspServer(context_); //В сочетании с UnInitRtspServer, даже если запущено несколько служб RTSP, InitRtspServer необходимо вызвать только один раз. Обязательно вызывайте его перед OpenRtspServer.
}
Запуск и остановка службы RTSP:
//Запуск/остановка службы RTSP
class ButtonRtspServiceListener implements View.OnClickListener {
public void onClick(View v) {
if (isRTSPServiceRunning) {
stopRtspService();
btnRtspService.setText("Запустить службу RTSP");
btnRtspPublisher.setEnabled(false);
isRTSPServiceRunning = false;
return;
}
Log.i(TAG, "onClick start rtsp service..");
rtsp_handle_ = libPublisher.OpenRtspServer(0);
if (rtsp_handle_ == 0) {
Log.e(TAG, «Создать rtsp экземпляр сервера не выполнен! Пожалуйста, проверьте достоверность SDK");
} else {
int port = 8554;
if (libPublisher.SetRtspServerPort(rtsp_handle_, port) != 0) {
libPublisher.CloseRtspServer(rtsp_handle_);
rtsp_handle_ = 0;
Log.e(TAG, «Создать rtsp Порт сервера не выполнен! Пожалуйста, проверьте, не дублируется ли порт или порт находится вне диапазона!");
}
if (libPublisher.StartRtspServer(rtsp_handle_, 0) == 0) {
Log.i(TAG, "Запустить rtsp-сервер успех!");
} else {
libPublisher.CloseRtspServer(rtsp_handle_);
rtsp_handle_ = 0;
Log.e(TAG, "Запустить rtsp-сервер не удался! Пожалуйста, проверьте, занят ли установленный порт!");
}
btnRtspService.setText("Остановить службу RTSP");
btnRtspPublisher.setEnabled(true);
isRTSPServiceRunning = true;
}
}
}
stopRtspService() реализован следующим образом:
//Остановка службы RTSP
private void stopRtspService() {
if(!isRTSPServiceRunning)
{
return;
}
if (libPublisher != null && rtsp_handle_ != 0) {
libPublisher.StopRtspServer(rtsp_handle_);
libPublisher.CloseRtspServer(rtsp_handle_);
rtsp_handle_ = 0;
}
}
Опубликовать и остановить потоковую передачу RTSP:
//Публикация/Остановка потока RTSP
class ButtonRtspPublisherListener implements View.OnClickListener {
public void onClick(View v) {
if (stream_publisher_.is_rtsp_publishing()) {
stopRtspPublisher();
btnRtspPublisher.setText("Опубликовать поток RTSP");
btnGetRtspSessionNumbers.setEnabled(false);
btnRtspService.setEnabled(true);
return;
}
Log.i(TAG, "onClick start rtsp publisher..");
InitAndSetConfig();
String rtsp_stream_name = "stream1";
stream_publisher_.SetRtspStreamName(rtsp_stream_name);
stream_publisher_.ClearRtspStreamServer();
stream_publisher_.AddRtspStreamServer(rtsp_handle_);
if (!stream_publisher_.StartRtspStream()) {
stream_publisher_.try_release();
Log.e(TAG, «Ошибка публикации интерфейса потока rtsp!»);
return;
}
startAudioRecorder();
startLayerPostThread();
btnRtspPublisher.setText("Остановить поток RTSP");
btnGetRtspSessionNumbers.setEnabled(true);
btnRtspService.setEnabled(false);
}
}
stopRtspPublisher() реализован следующим образом:
//останавливаться Опубликовать RTSP-поток
private void stopRtspPublisher() {
stream_publisher_.StopRtspStream();
stream_publisher_.try_release();
if (!stream_publisher_.is_publishing())
stopAudioRecorder();
}
Платформа Android реализует облегченные службы RTSP в среде интрасети и совместно использует данные камеры или микрофона. Если ее собственный технологический стек завершен, его можно реализовать на основе GStreamer. Кстати, он также обладает возможностями, связанными с потоковым мультимедиа. Это коммерческий продукт, он будет иметь высокое качество и функциональные характеристики. Вы можете использовать готовый SmartRtspServer, который имеет низкую сложность интеграции, более стабилен и надежен. Выше приведено сравнение между ними. Заинтересованные разработчики могут связаться со мной индивидуально для обсуждения.