WebRTC清晰度和流畅度
WebRTC清晰度和流畅度
flyfish
WebRTC提供了4种模式DISABLED,MAINTAIN_FRAMERATE,MAINTAIN_RESOLUTION,BALANCED
// Based on the spec in
// https://w3c.github.io/webrtc-pc/#idl-def-rtcdegradationpreference.
// These options are enforced on a best-effort basis. For instance, all of
// these options may suffer some frame drops in order to avoid queuing.
// TODO(sprang): Look into possibility of more strictly enforcing the
// maintain-framerate option.
// TODO(deadbeef): Default to "balanced", as the spec indicates?
enum class DegradationPreference {// Don't take any actions based on over-utilization signals. Not part of the// web API.DISABLED,// On over-use, request lower resolution, possibly causing down-scaling.MAINTAIN_FRAMERATE,// On over-use, request lower frame rate, possibly causing frame drops.MAINTAIN_RESOLUTION,// Try to strike a "pleasing" balance between frame rate or resolution.BALANCED,
};
接口是
// See https://crbug.com/653531 and https://w3c.github.io/mst-content-hint.enum class ContentHint { kNone, kFluid, kDetailed, kText };
根据源码 接口这里不是一一对应的kDetailed和kText是类似的
webrtc::DegradationPreference
WebRtcVideoChannel::WebRtcVideoSendStream::GetDegradationPreference() const {// Do not adapt resolution for screen content as this will likely// result in blurry and unreadable text.// `this` acts like a VideoSource to make sure SinkWants are handled on the// correct thread.if (!enable_cpu_overuse_detection_) {return webrtc::DegradationPreference::DISABLED;}webrtc::DegradationPreference degradation_preference;if (rtp_parameters_.degradation_preference.has_value()) {degradation_preference = *rtp_parameters_.degradation_preference;} else {if (parameters_.options.content_hint ==webrtc::VideoTrackInterface::ContentHint::kFluid) {degradation_preference =webrtc::DegradationPreference::MAINTAIN_FRAMERATE;} else if (parameters_.options.is_screencast.value_or(false) ||parameters_.options.content_hint ==webrtc::VideoTrackInterface::ContentHint::kDetailed ||parameters_.options.content_hint ==webrtc::VideoTrackInterface::ContentHint::kText) {degradation_preference =webrtc::DegradationPreference::MAINTAIN_RESOLUTION;} else if (IsEnabled(call_->trials(), "WebRTC-Video-BalancedDegradation")) {// Standard wants balanced by default, but it needs to be tuned first.degradation_preference = webrtc::DegradationPreference::BALANCED;} else {// Keep MAINTAIN_FRAMERATE by default until BALANCED has been tuned for// all codecs and launched.degradation_preference =webrtc::DegradationPreference::MAINTAIN_FRAMERATE;}}return degradation_preference;
}
使用方法
// create a new webrtc stream
{std::lock_guard<std::mutex> mlock(m_streamMapMutex);std::map<std::string, std::pair<rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>, rtc::scoped_refptr<webrtc::AudioSourceInterface>>>::iterator it = m_stream_map.find(streamLabel);if (it != m_stream_map.end()){std::pair<rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>, rtc::scoped_refptr<webrtc::AudioSourceInterface>> pair = it->second;rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> videoSource(pair.first);if (!videoSource){RTC_LOG(LS_ERROR) << "Cannot create capturer video:" << videourl;}else{rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track = m_peer_connection_factory->CreateVideoTrack(streamLabel + "_video", videoSource.get());if ((video_track) && (!peer_connection->AddTrack(video_track, {streamLabel}).ok())){RTC_LOG(LS_ERROR) << "Adding VideoTrack to MediaStream failed";}else{RTC_LOG(LS_INFO) << "VideoTrack added to PeerConnection";ret = true;} }
上述代码video_track创建好之后,调用
video_track->set_content_hint(webrtc::VideoTrackInterface::ContentHint::kDetailed);
参考
https://w3c.github.io/webrtc-pc/#idl-def-rtcdegradationpreference
https://crbug.com/653531 and https://w3c.github.io/mst-content-hint
相关文章:
WebRTC清晰度和流畅度
WebRTC清晰度和流畅度 flyfish WebRTC提供了4种模式DISABLED,MAINTAIN_FRAMERATE,MAINTAIN_RESOLUTION,BALANCED // Based on the spec in // https://w3c.github.io/webrtc-pc/#idl-def-rtcdegradationpreference. // These options are …...
华为数通方向HCIP-DataCom H12-821题库(单选题:181-200)
第181题 某管理员需要创建AS Path过滤器(ip as-path-iter),允许AS_Path中包含65001的路由通过,那么以下哪一项配置是正确的? A、ip as-path-filter 1 permit 65001 B、ip as-path-filter 1 permit "65001 C、ip as-path-filter 1 permit *6500…...
海康威视二次开发适配安卓电视盒子
收到一个需求,需要在安卓电视盒子上适配海康威视摄像头视频: 1.类似电视家app界面,左边滑动菜单显示通道列表、设置按钮,遥控器呼出菜单。 2.遥控器操作:切换视频通道、云台上下左右控制、缩放等。 3.服务器域名、用…...
NIO原理浅析(二)
IO分类 阻塞和非阻塞 阻塞IO:用户空间引发内核空间的系统调用,需要内核IO操作彻底完成之后,返回值才会返回到用户空间,执行用户的操作。阻塞指的用户空间程序的执行状态,用户空间程序需要等到IO操作彻底执行完毕。j…...
leetcode每日一练-第53题-最大子数组和
一、思路 动态规划 二、解题方法 使用了两个变量 maxSum 和 currentSum 来分别记录全局的最大和和当前连续子数组的和。遍历数组时,我们不断更新 currentSum,并比较是否需要更新 maxSum。最后,maxSum 就是最大的连续子数组和。 三、code …...
京东云接入【风险识别】接口
京东云的接入文档写的真的跟逗你玩一样,就给提供了一个简单的实例,其他的全靠自己摸索。 这篇文章描述的是激动云【风险识别接口】接入,也会介绍如何接入其他的一些未在文章内描述到的接口。 这里使用的是python SDK,先安装 pip…...
在 linux 虚拟机上安装配置 hive
目录 一 下载hive 安装包 二 解压 hive 并配置环境变量 三 配置hive 的配置文件 四 更新 guava 五 hive初始化 六 开启远程连接 七 使用datagrip 连接 hive 一 下载hive 安装包 百度网盘资源如下: 链接: https://pan.baidu.com/s/18jF-Qri0hc52_rtL61O0YQ?…...
作品集(陆续上传中)
智能家居---不断完善中 家居-CSDN直播 家居 语音刷抖音 --- 基于串口和adb 基于守护进程的语音刷抖音-CSDN直播 基于守护进程的语音刷抖音 海天一色项目 --- 船舶靠港零碳排加热器 FTP云盘 --- 多进程和socket FTP云盘-CSDN直播 FTP云盘...
论文解读 | 三维点云深度学习的综述
原创 | 文 BFT机器人 KITTI 是作为基准测试是自动驾驶中最具影响力的数据集之一,在学术界和工业界都被广泛使用。现有的三维对象检测器存在着两个限制。第一是现有方法的远程检测能力相对较差。其次,如何充分利用图像中的纹理信息仍然是一个开放性的问题…...
基于costas环的载波同步系统matlab性能仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................................ I_Dataroun…...
解码自我注意的魔力:深入了解其直觉和机制
一、说明 自我注意机制是现代机器学习模型中的关键组成部分,尤其是在处理顺序数据时。这篇博文旨在提供这种机制的详细概述,解释它是如何工作的,它的优点,以及它背后的数学原理。我们还将讨论它在变压器模型中的实现和多头注意力的…...
mysql之存储引擎
目录 存储引擎概念 MyISAM MyISAM特点 MyISAM 表的存储格式 MyISAM适用的生产场景 InnoDB InnoDB特点 选择存储引擎依据 MyISAM 和 INNODB区别 命令 查看系统支持的存储引擎 查看表使用的存储引擎 修改存储引擎 存储引擎概念 MySQL中的数据用各种不同的技术存…...
服务器日志出现大量NTLM(NT LAN Manager)攻击
日志名称:Security 来源: Microsoft-Windows-Security-Auditing 日期: 2023/8/30 20:57:40 事件 ID:4625 任务类别:登录 级别: 信息 关键字: 审核失败 用户: 暂缺 计算机: WIN-QBJ3ORTR0CF 描述: 帐户登录失败。 主题: 安全 ID:NULL SID 帐户名:- 帐户域:- …...
Spring学习|Spring简介、IOC控制反转理解、IOC创建对象方式
Spring Spring:春天------>给软件行业带来了春天! 2002,首次推出了Spring框架的雏形: interface21框架! Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日发布了1.0正式版。 RodJohnson,Spring Framework创始人&…...
DDR2 IP核调式记录2
本文相对简单,只供自己看看就行。从其它的博客找了个代码,然后记录下仿真波形。 1. 功能 直接使用quartus生成的DDR2 IP核,然后实现循环 -->写入burst长度的数据后读出。 代码数据的传输是32位,实际使用了两片IC。因此IP核也是…...
【ES6】js 中class的extends、super关键字用法和避坑点
在JavaScript中,使用class关键字可以实现面向对象编程。其中,extends和super是两个非常重要的关键字,它们分别用于实现类的继承和调用父类的方法。 一、extends关键字 extends关键字用于实现类的继承,它可以让一个子类继承父类的…...
mysql排名函数row_number()over(order by)和with * as 的用法
601. 体育馆的人流量(力扣mysql题,难度:困难) 表:Stadium ------------------------ | Column Name | Type | ------------------------ | id | int | | visit_date | date | | people | int | ------------------------vis…...
linux局域网IP地址冲突检测
使用keepalived设置vip的时候,发现vip无法连接,经查是出现了ip地址冲突,使用了一个在用的ip作为了vip,但是这个ip其实ping不通,因为目标机禁用了ping,也即是丢弃了ICMP包。 一、那么怎么检测IP地址是否已经…...
远距离WiFi模组方案,实现移动设备之间高效通信,无人机远程图传应用
随着科技的不断进步,无线通信技术也在日新月异地发展。其中,WiFi技术已经成为现代生活中不可或缺的一部分。 从室内到室外,WiFi的应用场景正在不断扩大,为我们的日常生活和工业生产带来了极大的便利。 WiFi技术,即无…...
Docker构建Springboot项目,并发布测试
把SpringBoot项目打包成Docker镜像有两种方案: 全自动化:先打好docker镜像仓库,然后在项目的maven配置中配置好仓库的地址,在项目里配置好Dockerfile文件,这样可以直接在idea中打包好后自动上传到镜像仓库,…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
