Linux 플랫폼은 어떻게 오디오 및 비디오 데이터를 수집하고 경량 RTSP 서비스를 주입합니까?

기술적 배경

많은 개발자들이 우리에게 가장 많이 묻는 질문은 왜 경량 RTSP 서비스를 설계해야 하는가입니다. 경량 RTSP 서비스와 RTSP 서비스의 차이점은 무엇입니까?

이 질문에 대한 답변은 다음과 같습니다. 경량 RTSP 서비스로 해결되는 핵심 문제점은 사용자나 개발자가 RTSP 서비스 또는 RTMP 서비스를 별도로 배포하지 못하도록 하는 것입니다. RTSP 서비스는 동시적이거나 상대적으로 강력하며 데이터 주입 모드는 일반적으로 외부 직접 푸시 스트리밍.RTSP 서비스로(현재 대부분의 스트리밍 미디어 서비스는 대부분 RTMP이며, 상대적으로 RTSP 서비스가 적습니다. 즉, 상업적으로 사용할 수 있는 RTSP 서비스가 상대적으로 적습니다. 오디오 및 오디오 분야에서는 비디오 데이터 푸시, RTMP 푸시가 주를 이루고 RTSP 푸시는 드물다. 스트림), 데이터 소스에 직접 배포되는 경량 RTSP 서비스로, 수집된 화면, 카메라, 마이크 데이터에 해당합니다. 로컬 경량 RTSP 서비스에 직접 인코딩되어 주입되고 스트림을 가져오기 위한 RTSP URL이 외부에 제공됩니다. 말하자면 경량 RTSP 서비스는 동시성이 아닌 편의성에 초점을 맞춘 IPC 카메라에 가깝습니다.

디자인 아키텍처 다이어그램

Windows, Android, iOS 플랫폼의 경량 RTSP 서비스에 대해서는 앞서 설명하였으므로 자세히 설명하지 않겠습니다.오늘은 Linux 플랫폼의 경량 RTSP 서비스를 소개합니다.

다른 플랫폼과 마찬가지로 Linux 플랫폼은 여전히 ​​로컬 오디오 및 비디오 데이터(예: 화면, 카메라, 마이크)를 구현합니다.인코딩 및 패키징 후 내장 RTSP 서비스로 집계되고 스트리밍을 위한 외부 RTSP URL, 경량 RTSP를 제공합니다. 인트라넷 환경 및 동시성 요구 사항이 낮은 시나리오에 적합한 서비스로 H.264/H.265, RTSP 인증, 유니캐스트, 멀티캐스트 모드를 지원하며, 단일 서비스의 전송 용량을 고려하여 여러 서비스 생성을 동시에 지원합니다. 동시에 RTSP 서비스를 제공하며 현재 RTSP 서비스 세션 연결 수를 얻는 것을 지원합니다.

기능 디자인

  •  [기본 기능] 기존 화면, 카메라, 오디오 수집 및 처리 등을 지원합니다.
  •  [오디오 형식]AAC;
  •  [비디오 형식] H.264, H.265;
  •  [프로토콜 종류]RTSP;
  •  [전송 모드] 유니캐스트 및 멀티캐스트 모드를 지원합니다.
  •  [포트 설정] RTSP 포트 설정을 지원합니다.
  •  [인증 설정] RTSP 인증 사용자 이름 및 비밀번호 설정을 지원합니다.
  •  [세션 연결 수 가져오기] 현재 RTSP 서비스 세션 연결 수 가져오기를 지원합니다.
  •  [다중 서비스 지원] 동시에 여러 내장 RTSP 서비스 생성을 지원합니다.
  •  [H.265 지원] Windows 내장 rtsp 서버는 H.265 비디오(64비트 라이브러리) 게시를 지원합니다.
  •  [RTSP url 콜백] 이벤트를 통해 상위 레이어로 콜백되도록 설정된 rtsp url을 지원합니다.

인터페이스 디자인

RTSP 서버 운영 인터페이스 디자인:

		/*
         * nt_linux_smart_publisher_sdk.h
         * Created by daniusdk.com
         */

        /*+++rtsp server操作接口+++*/


		/*
		* 创建一个rtsp server 
		* pRtspServerHandle: rtsp server 句柄
		* reserve:保留参数传0
		* 成功返回 NT_ERC_OK
		*/
		NT_UINT32(NT_API *OpenRtspServer)(NT_PHANDLE pRtspServerHandle, NT_INT32 reserve);

		/*
		* 设置rtsp server 监听端口, 在StartRtspServer之前必须要设置端口
		* rtsp_server_handle: rtsp server 句柄
		* port: 端口号,可以设置为554,或者是1024到65535之间,其他值返回失败
		* 成功返回 NT_ERC_OK
		*/
		NT_UINT32(NT_API *SetRtspServerPort)(NT_HANDLE rtsp_server_handle, NT_INT32 port);

		/*
		* 设置rtsp server 鉴权用户名和密码, 这个可以不设置,只有需要鉴权的再设置
		* rtsp_server_handle: rtsp server 句柄
		* user_name: 用户名,必须是英文
		* password:密码,必须是英文
		* 成功返回 NT_ERC_OK
		*/
		NT_UINT32(NT_API *SetRtspServerUserNamePassword)(NT_HANDLE rtsp_server_handle, NT_PCSTR user_name, NT_PCSTR password);


		/*
		* 设置rtsp server 组播, 如果server设置成组播就不能单播,组播和单播只能选一个, 一般来说单播网络设备支持的好,wifi组播很多路由器不支持
		* rtsp_server_handle: rtsp server 句柄
		* is_multicast: 是否组播, 1为组播, 0为单播, 其他值接口返回错误, 默认是单播
		* 成功返回 NT_ERC_OK
		*/
		NT_UINT32(NT_API *SetRtspServerMulticast)(NT_HANDLE rtsp_server_handle, NT_INT32 is_multicast);


		/*
		* 设置rtsp server 组播组播地址 
		* rtsp_server_handle: rtsp server 句柄
		* multicast_address: 组播地址
		* 如果设置的不是组播地址, 将返回错误
		* 组播地址范围说明: [224.0.0.0, 224.0.0.255] 为组播预留地址, 不能设置. 可设置范围为[224.0.1.0, 239.255.255.255], 其中SSM地址范围为[232.0.0.0, 232.255.255.255]
		* 成功返回 NT_ERC_OK
		*/
		NT_UINT32(NT_API *SetRtspServerMulticastAddress)(NT_HANDLE rtsp_server_handle, NT_PCSTR multicast_address);


		/*
		* 获取rtsp server当前的客户会话数, 这个接口必须在StartRtspServer之后再调用
		* rtsp_server_handle: rtsp server 句柄
		* session_numbers: 会话数
		* 成功返回 NT_ERC_OK
		*/
		NT_UINT32(NT_API *GetRtspServerClientSessionNumbers)(NT_HANDLE rtsp_server_handle, NT_INT32* session_numbers);


		/*
		* 启动rtsp server
		* rtsp_server_handle: rtsp server 句柄
		* reserve: 保留参数传0
		* 成功返回 NT_ERC_OK
		*/
		NT_UINT32(NT_API *StartRtspServer)(NT_HANDLE rtsp_server_handle, NT_INT32 reserve);

		/*
		* 停止rtsp server
		* rtsp_server_handle: rtsp server 句柄
		* 成功返回 NT_ERC_OK
		*/
		NT_UINT32(NT_API *StopRtspServer)(NT_HANDLE rtsp_server_handle);

		/*
		* 关闭rtsp server
		* 调用这个接口之后rtsp_server_handle失效,
		* 成功返回 NT_ERC_OK
		*/
		NT_UINT32 (NT_API *CloseRtspServer)(NT_HANDLE rtsp_server_handle);


		/*---rtsp server操作接口---*/

RTSP 스트림 관련 인터페이스 디자인 출시:

		/*
         * nt_linux_smart_publisher_sdk.h
         * Created by daniusdk.com
         */

        /*+++发布rtsp流相关接口+++*/


		/*
		* 设置rtsp的流名称
		* stream_name: 流程名称,不能为空字符串,必须是英文
		* 这个作用是: 比如rtsp的url是:rtsp://192.168.0.111/test, test就是设置下去的stream_name
		* 成功返回 NT_ERC_OK
		*/
		NT_UINT32(NT_API *SetRtspStreamName)(NT_HANDLE handle, NT_PCSTR stream_name);

		/*
		* 给要发布的rtsp流设置rtsp server, 一个流可以发布到多个rtsp server上,rtsp server的创建启动请参考OpenRtspServer和StartRtspServer接口
		* handle: 推送实例句柄
		* rtsp_server_handle:rtsp server句柄 
		* reserve: 保留参数,传0
		*/
		NT_UINT32(NT_API *AddRtspStreamServer)(NT_HANDLE handle, NT_HANDLE rtsp_server_handle, NT_INT32 reserve);

		
		/*
		* 清除设置的rtsp server
		*/
		NT_UINT32(NT_API *ClearRtspStreamServer)(NT_HANDLE handle);


		/*
		启动rtsp流
		reserve: 保留参数,传0
		*/
		NT_UINT32(NT_API *StartRtspStream)(NT_HANDLE handle, NT_INT32 reserve);

		
		/*
		停止rtsp流
		*/
		NT_UINT32(NT_API *StopRtspStream)(NT_HANDLE handle);


		/*---发布rtsp流相关接口---*/

통화 구현

RTSP 서버를 시작합니다:

	NT_HANDLE start_rtsp_server(NT_SmartPublisherSDKAPI* push_api, int port, std::string user_name, std::string password) {

		NT_HANDLE rtsp_server_handle = nullptr;
		if (NT_ERC_OK != push_api->OpenRtspServer(&rtsp_server_handle, 0)) {
			fprintf(stderr, "OpenRtspServer failed\n");
			return nullptr;
		}

		if (nullptr == rtsp_server_handle) {
			fprintf(stderr, "rtsp_server_handle is null\n");
			return nullptr;
		}

		if (NT_ERC_OK != push_api->SetRtspServerPort(rtsp_server_handle, port)) {
			push_api->CloseRtspServer(rtsp_server_handle);
			return nullptr;
		}

		if (!user_name.empty() && !password.empty())
			push_api->SetRtspServerUserNamePassword(rtsp_server_handle, user_name.c_str(), password.c_str());

		if (NT_ERC_OK == push_api->StartRtspServer(rtsp_server_handle, 0))
			return rtsp_server_handle;

		fprintf(stderr, "StartRtspServer failed\n");
		push_api->CloseRtspServer(rtsp_server_handle);
		
		return nullptr;
	}

RTSP 서버 중지:

	void stop_rtsp_server(NT_SmartPublisherSDKAPI* push_api, NT_HANDLE& rtsp_server_handle) {
		if (nullptr == rtsp_server_handle)
			return;

		NT_HANDLE handle = rtsp_server_handle;
		rtsp_server_handle = nullptr;

		push_api->StopRtspServer(handle);
		push_api->CloseRtspServer(handle);
	}

RTSP 스트림 게시 시작:

	bool start_rtsp_stream(NT_SmartPublisherSDKAPI* push_api, NT_HANDLE rtsp_server_handle, NT_HANDLE handle, const std::string stream_name) {

		push_api->SetRtspStreamName(handle, stream_name.c_str());

		push_api->ClearRtspStreamServer(handle);

		push_api->AddRtspStreamServer(handle, rtsp_server_handle, 0);
		
		if (NT_ERC_OK != push_api->StartRtspStream(handle, 0))
			return false;

		return true;
	}

RTSP 스트림 게시를 중지하려면 다음을 직접 호출하세요.

	stop_rtsp_server(&push_api, rtsp_server_handle);

수집된 오디오 및 비디오 데이터를 미리 보려면 미리 보기 인터페이스를 호출하면 됩니다.

	// 开启预览,也可以不开启, 根据需求来
	push_api.SetPreviewXWindow(push_handle, "", sub_wid);
	push_api.StartPreview(push_handle, 0, nullptr);

요약하다

경량 RTSP 서비스는 동시성 측면에서 강점은 아니지만 RTSP 또는 RTMP 서비스만 배포할 때 발생하는 문제점을 해결하고 프로젝트 구현 비용을 줄이며 동시성 요구 사항이 높지 않은 시나리오에서 매우 편리합니다.

추천

출처blog.csdn.net/renhui1112/article/details/132789145