C# 查询腾讯云直播流是否存在的API实现
应用场景
在云考试中,为防止作弊行为的发生,会在考生端部署音视频监控系统,当然还有考官方监控墙系统。在实际应用中,考生一方至少包括两路直播流:
(1)前置摄像头:答题的设备要求使用笔记本电脑,使用支持H5的WEB浏览器,并授权打开前置摄像头,产生一路直播流,以监控考生正面活体人像的行为,并进行录像留证。
(2)后方摄像:使用其它可用的摄像设备,如手机、平板等,打开摄像头,产生一路直播流,以监控考生背面、笔记本及前方音视频情况,并进行录像留证。
如果不考虑各种成本,还可以使用屏幕共享功能,以录制笔记本电脑屏幕上的一切操作行为。
腾讯云实时音视频
我们的云考试监控部分的开发采用基于腾讯云WebRTC的技术实现,其产品以多人音视频通话和低延时互动直播两大场景,通过开放API,帮助开发者快速搭建低成本、低延时、高品质的音视频互动解决方案。
具体可访问该网址进行了解:https://cloud.tencent.com/document/product/647
产品架构
下图是我们基于腾讯云产品架构图的部分采用和实现方案:

关于RoomID
当创建直播流的时候,我们可以简单的理解为,首先需要创建一个房间(音视频聊天室),该房间就应该分配一个唯一的房号,这房号就是RoomID。
RoomID是一组10位数字的字符串值,但在实际应用中,第一位不要为0,否则腾讯会自动转数值,而变成9位数字,这个位数是不合法的。但这种情况在微信小程序的RTC版本里不会出现。
另外,数值的范围最好在1000000000-5000000000这间,否则也有可能报错误,以上都是曾经踩到的一些坑点,在此分享。
需求示例
考试产品可以提供二维码或接口接入的形式,访问首页如下图演示:

核对信息无误后,创建RoomID和用户名,用户名按实际业务需要创建,比如前置为 roomid_1,后置为 roomid_2,从名称上可以区分前后直播流即可。 进入考试如下图:

创建了前置摄像直播流,提示用户用手机微信扫描以打开后方摄像头功能,如果成功则可以进行答题,如下图:

现在的需求是,如果考生在考试过程中断开其中一路或全部断开则提示其重新连接摄像头。我们采用了腾讯云给出的一种解决方案,利用其API定时查询对应的直播流是否存在,如果不存在则进行提示,以下图为例 :
关键代码
API实现
//查询在线直播流,参数1:部分或全部流名称,页码
//方法返回LVBStream类对象的ArrayList集合
public ArrayList SearchOnlineStream(string partname,string PageNum){ArrayList data = new ArrayList();//请求地址string settingUrl = "https://live.tencentcloudapi.com/";//应用ID和应用keystring secretId = 应用ID;string secretKey = 应用key;//时间戳string timesTamp = GetTimeStamp();//Noncevar nonce = new Random().Next(10000, 99999);//拼接参数 abcdefghijklmnopqstring paramsStr = string.Format(@"Action=DescribeLiveStreamOnlineList&Nonce={0}&PageNum=1&PageSize=100&Region=ap-guangzhou&SecretId={1}&SignatureMethod=HmacSHA1&Timestamp={2}&Version=2018-08-01",nonce, secretId, timesTamp);//生成签名参数// string requestText = settingUrl + "?" + paramsStr;string requestText = "POST" + settingUrl.Replace("https://", "") + "?" + paramsStr;//获得请求签名string signText = GetHmacSha1Sign(secretKey, requestText);//这里一定要进行URL编码,不然调用API会报错signText = HttpUtility.UrlEncode(signText, Encoding.UTF8);
// string text = HttpUtility.UrlEncode(SearchText, Encoding.UTF8);paramsStr = string.Format(@"Action=DescribeLiveStreamOnlineList&Nonce={0}&PageNum=1&PageSize=100&Region=ap-guangzhou&SecretId={1}&Signature={2}&SignatureMethod=HmacSHA1&Timestamp={3}&Version=2018-08-01",nonce, secretId, signText, timesTamp);//请求腾讯API,返回身份证信息string resultStr = SendRequest(settingUrl, paramsStr);if (resultStr.IndexOf("TotalNum") != -1){Newtonsoft.Json.Linq.JObject jsonObj = Newtonsoft.Json.Linq.JObject.Parse(resultStr);//"Response":{"MediaInfoSet":[],"TotalCount":0, "RequestId":"85f181fc-d76f-42bb-82d8-7ac4d5ff432a"}}int total = jsonObj["Response"]["OnlineInfo"].Count();int totalpage =int.Parse(jsonObj["Response"]["TotalPage"].ToString());for (int i = 0; i < total; i++){LVBStream ls = new LVBStream();try{ls.StreamName = jsonObj["Response"]["OnlineInfo"][i]["StreamName"].ToString();ls.AppName = jsonObj["Response"]["OnlineInfo"][i]["AppName"].ToString();ls.DomainName = jsonObj["Response"]["OnlineInfo"][i]["DomainName"].ToString();if (partname != ""){if (ls.StreamName.IndexOf(partname) != -1){data.Add(ls);}}else{data.Add(ls);}}catch (Exception e) { }}if (totalpage > 1 && int.Parse(PageNum) == 1){for (int i = int.Parse(PageNum) + 1; i <= totalpage; i++) {ArrayList data2 = new ArrayList();data2 = SearchOnlineStream(partname, i.ToString());foreach (CoWeixin.wxLiveManager.TencentCloud.LVBStream lvb in data2){data.Add(lvb);}}}return data;}return data;
} //search media
public class LVBStream
{public string StreamName = "";public string AppName = "";public string DomainName = "";public LVBStream(){}
}public static string GetTimeStamp(){TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);return Convert.ToInt64(ts.TotalSeconds).ToString();}/// <summary>/// HMAC-SHA1加密返回签名/// </summary>/// <param name="secret">密钥</param>/// <param name="strOrgData">源文</param>/// <returns></returns>public static string GetHmacSha1Sign(string secret, string strOrgData){var hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(secret));var dataBuffer = Encoding.UTF8.GetBytes(strOrgData);var hashBytes = hmacsha1.ComputeHash(dataBuffer);return Convert.ToBase64String(hashBytes);}public static string SendRequest(string url, string completeUrl){ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072;HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";request.ProtocolVersion = HttpVersion.Version10;request.Host = url.Replace("https://", "").Replace("/", "");byte[] data = Encoding.UTF8.GetBytes(completeUrl);request.ContentLength = data.Length;Stream newStream = request.GetRequestStream();newStream.Write(data, 0, data.Length);newStream.Close();HttpWebResponse response = null;string content;try{response = (HttpWebResponse)request.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);content = reader.ReadToEnd();}catch (WebException e){response = (HttpWebResponse)e.Response;using (Stream errData = response.GetResponseStream()){using (StreamReader reader = new StreamReader(errData)){content = reader.ReadToEnd();}}}return content;}
JS调用的服务端方法
[WebMethod]
//统计在线流情况,传递RoomID房间号public static string onlineLiveCount(string roomid){string tip = "";ArrayList rv = SearchOnlineStream(roomid);bool isfront = false;bool isback = false;foreach (LVBStream lvb in rv){if (lvb.StreamName.IndexOf("_1_main")!=-1) //根据自己的命名规则判断 {isfront = true;}if (lvb.StreamName.IndexOf("_2_main") != -1) //根据自己的命名规则判断 {isback = true;}}if (rv.Count < 2){if (isfront == false){tip += "未监控到前方摄像头。<br>";}if (isfront==true&&isback == false){tip += "未监控到后方摄像头。<br>";}}return tip;}
小结
以上提供的代码仅供参考,在实际的应用中,我们要编写符合自己业务的逻辑,还要考虑实际的运营成本。有关腾讯RTC产品的价格情况,可以访问:https://cloud.tencent.com/document/product/647/17157
以上就是自己的一些分享,时间仓促,不妥之处还请大家批评指正!
相关文章:
C# 查询腾讯云直播流是否存在的API实现
应用场景 在云考试中,为防止作弊行为的发生,会在考生端部署音视频监控系统,当然还有考官方监控墙系统。在实际应用中,考生一方至少包括两路直播流: (1)前置摄像头:答题的设备要求使…...
JAVA开源项目 于道前端项目 启动步骤参考
1. 安装 启动过程有9个步骤: 1.1 安装 Node JS , V18版本的 (安装步骤省略) 1.2 安装 npm install -g yarn ,node JS里边好像自带npm ,通过npm的命令安装 yarn 1.3 切换到项目中去安装,npm install &a…...
深入理解ElasticSearch分片
1. 路由计算 当索引一个文档的时候,文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存储在分片 1 还是分片 2 中呢?首先这肯定不会是随机的&…...
【Python】AppUI自动化—appium自动化元素定位、元素事件操作(17)下
文章目录 前言一.Appium 元素定位1.定位方式种类2.如何定位2.1 id定位2.2 className定位2.3 content-desc 定位2.4 Android Uiautomator定位4.1 text定位4.2 text模糊定位4.3 text正则匹配定位4.4 resourceId定位4.5 resourceId正则匹配定位4.6 className定位4.7 className正则…...
SpringBoot使用MyBatis多数据源
SpringBoot使用MyBatis多数据源 我们以 Mybatis Xml和注解两种版本为例,给大家展示如何如何配置多数据源。 1、注解方式 数据库文件: DROP TABLE IF EXISTS users; CREATE TABLE users (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键id,userN…...
小程序版本审核未通过,需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path,请设置后再提交代码审核
小程序版本审核未通过,需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path,请设置后再提交代码审核 因小程序尚未发布,订单中心不能正常打开查看,请先发布小程序后再提交订单中心PATH申请 初次提交…...
Netty入门指南之NIO Selector监管
作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言问题解…...
Spring Cloud学习(六)【统一网关 Gateway】
文章目录 网关的功能搭建网关服务路由断言工厂Route Predicate Factory路由过滤器 GatewayFilter过滤器执行顺序跨域问题处理 网关的功能 网关功能: 身份认证和权限校验服务路由、负载均衡请求限流 在SpringCloud中网关的实现包括两种: gatewayzuul …...
基于单片机的空调智能控制器的设计
**单片机设计介绍,基于单片机的空调智能控制器的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的空调智能控制器需要具备输入输出端口、定时器、计数器等模块,以便对空调进行精确控制。下…...
Spring Boot自动配置原理、实战、手撕自动装配源码
Spring Boot自动配置原理 相比较于传统的 Spring 应用,搭建一个 SpringBoot 应用,我们只需要引入一个注解 SpringBootApplication,就可以成功运行。 前面四个不用说,是定义一个注解所必须的,关键就在于后面三个注解&a…...
111111111111111
全局锁 就是对整个数据库进行加锁,加锁之后整个数据库就处于只读状态,后续的DML写语句,DDL语句,以及对更新事务的提交操作都会被阻塞,典型地使用场景就是做整个数据库的逻辑备份,对所有的表进行锁定&#x…...
React动态生成二维码和毫米(mm)单位转像素(px)单位
一、使用qrcode.react生成二维码,qrcode.react - npm 很简单,安装依赖包,然后引用就行了 npm install qrcode.react或者 yarn add qrcode.react直接上写好的代码 import React, {useEffect, useState} from react; import QRCode from qr…...
SpringMvc 常见面试题
1、SpringMvc概述 1.1、什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦&am…...
jmeter接口自动化测试工具在企业开展实际的操作
在企业使用jmeter开展实际的接口自动化测试工具,建议按如下操作流程, 可以使整个接口测试过程更规范,更有效。 接口自动化的流程: 1、获取到接口文档:swagger、word、excel ... 2、熟悉接口文档然后设计测试用例&am…...
第17章 反射机制
通过本章需要理解反射机制操作的意义以及Class类的作用,掌握反射对象实例化操作,并且可以深刻理解反射机制与工厂模式结合意义。掌握类结构反射操作的实现,并且可以通过反射实现类中构造方法、普通方法、成员属性的操作。掌握反射机制与简单J…...
如何在在线Excel文档中对数据进行统计
本次我们将用zOffice表格的公式与数据透视表分析样例(三个班级的学生成绩)。zOffice表格内置了大量和Excel相同的统计公式,可以进行各种常见的统计分析,如平均值、标准差、相关性等。同时,zOffice也有数据透视表功能&a…...
redis配置文件详解
一、配置文件位置 以配置文件启动 Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf ( Windows名为redis.windows. conf) 例: # 这里要改成你自己的安装目录 cd ./redis-6.0.8 vim redis.conf redis对配置文件对大小写不敏感 二、配置文件 1、获取当前服务的…...
前端设计模式之【工厂模式】
文章目录 前言什么时候不用介绍工厂模式的流程例子优点缺陷后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端设计模式 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。…...
Python与ArcGIS系列(一)ArcGIS中使用Python
目录 0 简述1 arcgis中的python窗口2 开始编写代码 0 简述 按照惯例,作为本系列专栏的第一篇,先简单地介绍下本系列文章的内容:通过python语言创建arcgis环境脚本、将脚本以工具箱形式存放在arcgis中、通过脚本自动执行地理处理、数据修复、…...
LeetCode(2)移除元素【数组/字符串】【简单】
目录 1.题目2.答案3.提交结果截图 链接: 27. 移除元素 1.题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
