Linux平台如何实现采集音视频数据并注入轻量级RTSP服务?

本文涉及的产品
物联网平台,标准版 1个月
IoT设备身份认证,上限1000台 1个月
简介: Linux平台如何实现采集音视频数据并注入轻量级RTSP服务?
+关注继续查看

 技术背景

好多开发者,问我们最多的问题是,为什么要设计轻量级RTSP服务?轻量级RTSP服务,和RTSP服务有什么区别?

针对这个问题,我们的回答是:轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独部署RTSP服务或者RTMP服务,RTSP服务,并发或功能相对强大,数据注入模式一般是外部直接推流到RTSP服务(目前大多流媒体服务,以RTMP居多,RTSP的相对较少,或者说,可以商用的RTSP服务,相对较少,音视频数据推送这块,RTMP推送为主,很少有RTSP推流),轻量级RTSP服务,直接部署在数据源测,相当于采集到的屏幕、摄像头、麦克风数据,直接编码注入本地的轻量级RTSP服务,对外提供个可供拉流的RTSP URL,说到这里,轻量级RTSP服务,更像一个IPC摄像头,侧重的不是并发,而是便捷。

设计架构图

流程图.png

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鉴权用户名、密码设置;
  •  [获取session连接数]支持获取当前RTSP服务会话连接数;
  •  [多服务支持]支持同时创建多个内置RTSP服务;
  •  [H.265支持]Windows内置rtsp server支持发布H.265视频(64位库);
  •  [RTSP url回调]支持设置后的rtsp url通过event回调到上层。

接口设计

RTSP Server操作接口设计:

   /*
    * 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操作接口---*/

image.gif

发布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流相关接口---*/

image.gif

调用实现

启动RTSP Server:

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;
    }

image.gif

停止RTSP Server:

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);
    }

image.gif

开始发布RTSP Stream:

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;
    }

image.gif

如需停止RTSP流的发布,直接调用:

stop_rtsp_server(&push_api, rtsp_server_handle);

image.gif

如果需要采集到的音视频数据预览,调用预览接口即可:

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

image.gif

总结

轻量级RTSP服务,并发这块不是强项,不过确实解决了单独部署RTSP或RTMP服务的痛点,减少了工程实施成本,在并发量要求不高的场景下,非常方便。

相关文章
|
1月前
|
Java Linux Docker
使用Docker构建轻量级Linux容器
使用Docker构建轻量级Linux容器
|
2月前
|
运维 安全 Linux
企业实战(18)超简单实现轻量级开源堡垒机Teleport管理Linux/Windows主机(2)
企业实战(18)超简单实现轻量级开源堡垒机Teleport管理Linux/Windows主机(2)
|
3月前
|
Linux Android开发 开发者
[轻量级RTSP服务]Linux|麒麟操作系统下实现屏幕|系统声音采集
随着国产操作系统的推进,传统行业对Linux平台的呼声和需求越来越大,之前几年,我们发布了Linux平台运营商级的RTSP转RTMP推送模块、RTMP推送模块和RTSP、RTMP播放模块,前段时间,有开发者问我们,是不是可以在Linux平台实现轻量级RTSP服务,通过采集摄像头或者屏幕,在Linux平台实现类似于IPC的功能,便于第三方系统对接。
|
4月前
|
传感器 网络协议 物联网
Linux MQTT通信:实现轻量级物联网传输协议
MQTT(Message Queuing Telemetry Transport)是一种轻量级的物联网传输协议,专门设计用于低带宽、不稳定网络环境下的传感器和物联网设备通信。本文将深入探讨Linux环境下如何实现MQTT通信,介绍MQTT协议的基本原理、常用MQTT库以及如何在Linux系统中编写MQTT客户端和服务器端程序。
204 0
|
安全 应用服务中间件 Linux
通过命令验证docker容器相当一个轻量级的Linux运行环境,且每个容器内都有一个属于自己的文件系统,容器之间相互隔离
通过命令验证docker容器相当一个轻量级的Linux运行环境,且每个容器内都有一个属于自己的文件系统,容器之间相互隔离
191 0
|
应用服务中间件 Linux nginx
Linux之Centos7版本一键部署Nginx轻量级Web服务器脚本
!/bin/bash Date : 2019/7/29 Name : wuyang QQ : 2450497338 准备安装Nginx安装环境 wget http://nginx.org/download/nginx-1.
1451 0
|
Linux 应用服务中间件 Apache
《高性能Linux服务器构建实战》——第1章轻量级HTTP服务器Nginx
本节书摘来自华章社区《高性能Linux服务器构建实战》一书中的第1章轻量级HTTP服务器Nginx,作者:高俊峰,更多章节内容可以访问云栖社区“华章社区”公众号查看
1402 0
热门文章
最新文章
相关产品
物联网平台
物联网边缘计算
物联网络管理平台
推荐文章
更多