Windows平台RTMP推送摄像头对接介绍

简介: 好多开发者在对接大牛直播SDK(官方)的Windows平台RTMP推送时,不熟悉摄像头调用,实际上,摄像头调用逻辑并不复杂,以下是大概流程:

背景

好多开发者在对接大牛直播SDK(官方)的Windows平台RTMP推送时,不熟悉摄像头调用,实际上,摄像头调用逻辑并不复杂,以下是大概流程:


  1. 首先调用我们sdk接口获取摄像头个数,调用接口是:GetVideoCaptureDeviceNumber()
  2. 接着需要获取每个摄像头的id和name,调用接口是:GetVideoCaptureDeviceInfo()
  3. 接下来针对某个指定的摄像头,需要获取它的分辨率列表个数, 调用接口是:GetVideoCaptureDeviceCapabilityNumber()
  4. 根据摄像头id和分辨率的index,获取实际的分辨率,调用接口:GetVideoCaptureDeviceCapability()


对的,比如一个摄像头有四个分辨率 (1920*1080,1080*720,640*480, 320*240), 调用GetVideoCaptureDeviceCapabilityNumber 拿到的值就是4,想拿第一个index的分辨率,就传入GetVideoCaptureDeviceCapability(id, 0, capability)。

接口对接

以C#设计为例,接口设计如下:

        /*
         * 获取摄像头数量
         * 
         * pNumer: 返回设备数量
         * 
         * 成功返回 NT_ERC_OK
         */
        [DllImport(@"SmartPublisherSDK.dll")]
        public static extern UInt32 NT_PB_GetVideoCaptureDeviceNumber(ref Int32 pNumer);
        /*
         * 返回摄像头设备信息
         * 
         * device_index: 设备索引
         * device_name_utf8: 设备名称,传NULL将不返回名称,如果不是NULL的话, device_name_length必须大于等于256, 返回utf8编码的设备名称
         * device_name_length: 设备名称缓冲大小,如果device_name_utf8是NULL,则传入0, 否则必须大于等于256
         * device_unique_id_utf8: 设备唯一ID, 传NULL将不返回ID,如果不传NULL的话,device_unique_id_length必须大于等于1024,返回utf8编码的设备ID
         * device_unique_id_length: 设备唯一ID缓冲代销, 如果是device_unique_id_utf8NULL, 则传入0,否则必须大于等于1024
         * 
         * 成功返回 NT_ERC_OK
         */
        [DllImport(@"SmartPublisherSDK.dll")]
        public static extern UInt32 NT_PB_GetVideoCaptureDeviceInfo(
                Int32 device_index,
                [MarshalAs(UnmanagedType.LPStr)] StringBuilder device_name_utf8,
                UInt32 device_name_length,
                [MarshalAs(UnmanagedType.LPStr)] StringBuilder device_unique_id_utf8,
                UInt32 device_unique_id_length
                );
        /*
         * 返回摄像头能力数
         * 
         * device_unique_id_utf8: 设备唯一id
         * capability_number: 返回的设备能力数
         * 
         * 成功返回 NT_ERC_OK
         */
        [DllImport(@"SmartPublisherSDK.dll")]
        public static extern UInt32 NT_PB_GetVideoCaptureDeviceCapabilityNumber(
                [MarshalAs(UnmanagedType.LPStr)] String device_unique_id_utf8,
                ref Int32 capability_number
                );
        /*
         * 返回摄像头能力
         * 
         * device_unique_id_utf8: 设备唯一id
         * device_capability_index: 设备能力索引
         * capability: 设备能力
         * 
         * 成功返回 NT_ERC_OK
     */
        [DllImport(@"SmartPublisherSDK.dll", EntryPoint = "NT_PB_GetVideoCaptureDeviceCapability", CallingConvention = CallingConvention.StdCall)]
        public static extern UInt32 NT_PB_GetVideoCaptureDeviceCapability(
                [MarshalAs(UnmanagedType.LPStr)] String device_unique_id_utf8,
                Int32 device_capability_index,
                ref NT_PB_VideoCaptureCapability capability);

调用逻辑如下:

        private void FillCameraInfo()
        {
            int device_number = 0;
            if (NTBaseCodeDefine.NT_ERC_OK != NTSmartPublisherSDK.NT_PB_GetVideoCaptureDeviceNumber(ref device_number))
            {
                return;
            }
            if (device_number < 1)
            {
                return;
            }
            cameras_.Clear();
            for (int i = 0; i < device_number; ++i)
            {
                CameraInfo info = new CameraInfo();
                info.capabilities_ = new List<NT_PB_VideoCaptureCapability>();
                StringBuilder name = new StringBuilder(256);
                StringBuilder id = new StringBuilder(1024);
                if (NTBaseCodeDefine.NT_ERC_OK != NTSmartPublisherSDK.NT_PB_GetVideoCaptureDeviceInfo(i,
                    name, 256,
                    id, 1024))
                {
                    continue;
                }
                info.name_ = name.ToString();
                info.id_ = id.ToString();
                int capability_number = 0;
                if (NTBaseCodeDefine.NT_ERC_OK != NTSmartPublisherSDK.NT_PB_GetVideoCaptureDeviceCapabilityNumber(
                    id.ToString(), ref capability_number))
                {
                    continue;
                }
                bool is_failed = false;
                for (int j = 0; j < capability_number; ++j)
                {
                    NT_PB_VideoCaptureCapability capability = new NT_PB_VideoCaptureCapability();
                    if (NTBaseCodeDefine.NT_ERC_OK != NTSmartPublisherSDK.NT_PB_GetVideoCaptureDeviceCapability(
                        id.ToString(), j, ref capability))
                    {
                        is_failed = true;
                        break;
                    }
                    info.capabilities_.Add(capability);
                }
                if (!is_failed)
                {
                    cameras_.Add(info);
                }
            }
        }

在此之前,需要设置是采集摄像头,还是屏幕或者窗口:

        /*定义Video源选项*/
        public enum NT_PB_E_VIDEO_OPTION : uint
        {
            NT_PB_E_VIDEO_OPTION_NO_VIDEO = 0x0,
            NT_PB_E_VIDEO_OPTION_SCREEN = 0x1, // 采集屏幕
            NT_PB_E_VIDEO_OPTION_CAMERA = 0x2, // 摄像头采集
            NT_PB_E_VIDEO_OPTION_LAYER = 0x3,  // 视频合并,比如桌面叠加摄像头等
            NT_PB_E_VIDEO_OPTION_ENCODED_DATA = 0x4, // 已经编码的视频数据,目前支持H264
            NT_PB_E_VIDEO_OPTION_WINDOW = 0x5, // 采集窗口
        }

更详细的集成参考,参见:Windows平台RTMP直播推送集成简要说明_乐学吧-CSDN博客

相关文章
|
2月前
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
214 4
|
2月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
2月前
|
NoSQL Shell MongoDB
Windows 平台安装 MongoDB
10月更文挑战第10天
49 0
Windows 平台安装 MongoDB
|
3月前
|
监控 C# 块存储
Windows平台RTSP|RTMP播放器如何叠加OSD文字
做Windows平台RTSP|RTMP播放器的时候,特别是多路播放场景下,开发者希望可以给每一路RTSP或RTMP流添加个额外的OSD台标,以区分不同的设备信息(比如添加摄像头所在位置),本文主要探讨,如何动态添加OSD台标。
Windows平台RTSP|RTMP播放器如何叠加OSD文字
|
3月前
|
Linux Android开发 iOS开发
Windows平台RTSP|RTMP播放器如何实现实时录像功能
Windows平台RTSP、RTMP播放器实时录像接口设计,实际上,除了Windows平台,我们Linux、Android、iOS平台也是一样的设计,单纯的录像模块,如果做的全面,也不是一两个接口可以搞定的
|
2月前
|
并行计算 开发工具 异构计算
在Windows平台使用源码编译和安装PyTorch3D指定版本
【10月更文挑战第6天】在 Windows 平台上,编译和安装指定版本的 PyTorch3D 需要先安装 Python、Visual Studio Build Tools 和 CUDA(如有需要),然后通过 Git 获取源码。建议创建虚拟环境以隔离依赖,并使用 `pip` 安装所需库。最后,在源码目录下运行 `python setup.py install` 进行编译和安装。完成后即可在 Python 中导入 PyTorch3D 使用。
216 0
|
11天前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
16天前
|
监控 安全 网络安全
Windows Server管理:配置与管理技巧
Windows Server管理:配置与管理技巧
48 3
|
20天前
|
存储 安全 网络安全
Windows Server 本地安全策略
由于广泛使用及历史上存在的漏洞,Windows服务器成为黑客和恶意行为者的主要攻击目标。这些系统通常存储敏感数据并支持关键服务,因此组织需优先缓解风险,保障业务的完整性和连续性。常见的威胁包括勒索软件、拒绝服务攻击、内部威胁、恶意软件感染等。本地安全策略是Windows操作系统中用于管理计算机本地安全性设置的工具,主要包括用户账户策略、安全选项、安全设置等。实施强大的安全措施,如定期补丁更新、网络分段、入侵检测系统、数据加密等,对于加固Windows服务器至关重要。
|
2月前
|
边缘计算 安全 网络安全