¿Cómo implementa el módulo de servicio RTSP liviano de la plataforma Android un servicio para publicar múltiples transmisiones RTSP?

Cuando estábamos creando servicios RTSP livianos para la plataforma Android y puertas de enlace RTSP de intranet, nos encontramos con este problema: ¿Cómo liberar múltiples transmisiones RTSP al mismo tiempo?

Responder a esta pregunta en realidad no es difícil. Cuando Daniu Live SDK diseñó este módulo, tuvo en cuenta la situación de un Servicio con múltiples flujos. La siguiente es la implementación técnica aproximada:

Inicie el servicio RTSP:

Al iniciar el servicio RTSP, puede observar que OpenRtspServer() devolverá rtsp_handle_, que corresponde a un servicio RTSP.

	class ButtonRtspServiceListener implements OnClickListener {
		public void onClick(View v) {
			if (isRTSPServiceRunning) {
				stopRtspService();

				btnRtspService.setText("启动RTSP服务");
				btnRtspPublisher.setEnabled(false);

				isRTSPServiceRunning = false;
				return;
			}

			if(!OpenPushHandle())
			{
				return;
			}

			Log.i(TAG, "onClick start rtsp service..");

			rtsp_handle_ = libPublisher.OpenRtspServer(0);

			if (rtsp_handle_ == 0) {
				Log.e(TAG, "创建rtsp server实例失败! 请检查SDK有效性");
			} else {
				int port = 8554;
				if (libPublisher.SetRtspServerPort(rtsp_handle_, port) != 0) {
					libPublisher.CloseRtspServer(rtsp_handle_);
					rtsp_handle_ = 0;
					Log.e(TAG, "创建rtsp server端口失败! 请检查端口是否重复或者端口不在范围内!");
				}

				//String user_name = "admin";
				//String password = "12345";
				//libPublisher.SetRtspServerUserNamePassword(rtsp_handle_, user_name, password);

				if (libPublisher.StartRtspServer(rtsp_handle_, 0) == 0) {
					Log.i(TAG, "启动rtsp server 成功!");
				} else {
					libPublisher.CloseRtspServer(rtsp_handle_);
					rtsp_handle_ = 0;
					Log.e(TAG, "启动rtsp server失败! 请检查设置的端口是否被占用!");
				}

				btnRtspService.setText("停止RTSP服务");
				btnRtspPublisher.setEnabled(true);

				isRTSPServiceRunning = true;
			}
		}
	}

¿Cómo detener este servicio RTSP?

	//发布/停止RTSP流
	class ButtonRtspPublisherListener implements OnClickListener {
		public void onClick(View v) {
			if (isRTSPPublisherRunning) {
				stopRtspPublisher();

				btnRtspPublisher.setText("发布RTSP流");
				btnGetRtspSessionNumbers.setEnabled(false);
				btnRtspService.setEnabled(true);
			}
			else
			{
				Log.i(TAG, "onClick start rtsp publisher..");

				boolean startRet = StartRtspStream();

				if (!startRet) {
					Log.e(TAG, "Failed to call StartRtspStream().");
					return;
				}

				btnRtspPublisher.setText("停止RTSP流");
				btnGetRtspSessionNumbers.setEnabled(true);
				btnRtspService.setEnabled(false);
			}
		}
	};

¿Cómo iniciar un servicio y publicar múltiples transmisiones RTSP (correspondientes a diferentes fuentes de datos y URL de transmisión RTSP)?

De hecho, solo asegúrese de que cada transmisión RTSP publicada corresponda a un identificador de editor y que la entrega de datos de audio y video también pase este identificador de editor.

	private boolean StartRtspStream(long publisherHandle, String rtsp_stream_name)
	{
		if (isRTSPPublisherRunning)
			return false;

		libPublisher.SetRtspStreamName(publisherHandle, rtsp_stream_name);
		libPublisher.AddRtspStreamServer(publisherHandle, rtsp_handle_, 0);

		if (libPublisher.StartRtspStream(publisherHandle, 0) != 0)
		{
			Log.e(TAG, "调用发布rtsp流接口失败!");

			if (!isPushing)
			{
				libPublisher.SmartPublisherClose(publisherHandle);
				publisherHandle = 0;
			}

			return false;
		}

		isRTSPPublisherRunning = true;
		return true;
	}

Dejar de publicar transmisiones RTSP:

	//停止发布RTSP流
	private void stopRtspPublisher(long publisherHandle)
	{
		if(!isRTSPPublisherRunning)
			return;

		isRTSPPublisherRunning = false;

		if (null == libPublisher || 0 == publisherHandle)
			return;

		libPublisher.StopRtspStream(publisherHandle);

		if (!isPushing && !isRTSPServiceRunning)
		{
			releasePublisherHandle();
		}
	}

Cada transmisión RTSP publicada corresponde a una devolución de llamada de evento, que devuelve la URL RTSP que se puede transmitir externamente:

	class EventHandlePublisherV2 implements NTSmartEventCallbackV2 {
		@Override
		public void onNTSmartEventCallbackV2(long handle, int id, long param1, long param2, String param3, String param4, Object param5) {

			Log.i(TAG, "EventHandlePublisherV2: handle=" + handle + " id:" + id);

			String publisher_event = "";

			switch (id) {
				...
				case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_RTSP_URL:
					publisher_event = "RTSP服务URL: " + param3;
					break;
        ...
			}
		}
	}

Si necesita obtener la cantidad de enlaces de sesión para un solo Servicio:

	//获取RTSP会话数
	class ButtonGetRtspSessionNumbersListener implements OnClickListener {
		public void onClick(View v) {
			if (libPublisher != null && rtsp_handle_ != 0) {
				int session_numbers = libPublisher.GetRtspServerClientSessionNumbers(rtsp_handle_);

				Log.i(TAG, "GetRtspSessionNumbers: " + session_numbers);

				PopRtspSessionNumberDialog(session_numbers);
			}
		}
	};

Lo anterior es una idea de diseño general y los desarrolladores interesados ​​pueden consultarla.

Supongo que te gusta

Origin blog.csdn.net/renhui1112/article/details/133277848
Recomendado
Clasificación