WebRTC视频分辨率设置
前面我们能够打开摄像头。getUserMedia()时会传入参数,在参数里我们可以指定宽高信息。通过宽高参数控制输出的视频分辨率。
html
在页面上摆放一些元素,下面是主要部分
<div id="container">
<div id="buttons">
<button id="stop">停止</button>
<button id="b320">320x240</button>
<button id="b240-320">240x320</button>
<button id="b640">640x480</button>
<button id="b1280">1280x720</button>
<button id="b1920">1920x1080</button>
<button id="b2048">2048x1152</button>
</div>
<div id="videoblock" style="display: none">
<p id="dimensions" style="height: 1em;"></p>
<video playsinline autoplay style="background: none;height: auto;width: auto;"></video>
<div id="width">
<label>Width <span></span>px:</label>
<input type="range" min="0" max="7680" value="0">
</div>
<input id="isFullWidth" type="checkbox">视频宽度100%<br>
<input id="aspectlock" type="checkbox">锁定宽高比<br>
</div>
<p id="msg" style="display: none;"></p>
</div>
<script src="../js/adapter-latest.js" async></script> <!-- 使用本地的适配器 -->
<script src="js/main.js" async></script>
button一些按钮用来选择分辨率videoblock用来显示视频,默认隐藏dimensions用来现实视频的一些信息video宽高先设置为auto#width input滑动选择视频的宽度isFullWidth让video宽度为100%msg显示错误信息
js
拿到一些元素
const dimensionsInfo = document.querySelector('#dimensions');
const video = document.querySelector('video');
let stream;
const videoblock = document.querySelector('#videoblock'); // 视频区域
const messagebox = document.querySelector('#msg');
const widthInput = document.querySelector('div#width input');
const widthOutput = document.querySelector('div#width span');
const aspectLock = document.querySelector('#aspectlock');
const fullWidSetting = document.querySelector('#isFullWidth');
启动视频
先把拿到流的处理方法写出来
function gotStream(mediaStream) {
stream = window.stream = mediaStream; // 给控制台
video.srcObject = mediaStream;
messagebox.style.display = 'none';
videoblock.style.display = 'block';
const track = mediaStream.getVideoTracks()[0];
const constraints = track.getConstraints();
console.log('当前constraints: ' + JSON.stringify(constraints));
if (constraints && constraints.width && constraints.width.exact) {
widthInput.value = constraints.width.exact;
widthOutput.textContent = constraints.width.exact;
} else if (constraints && constraints.width && constraints.width.min) {
widthInput.value = constraints.width.min;
widthOutput.textContent = constraints.width.min;
}
}
拿到视频流后,track.getConstraints()获取信息,显示出当前信息并修改ui。
以按钮320为例
document.querySelector('#b320').onclick = () => {
const c320 = {
video: { width: { exact: 320 }, height: { exact: 240 } }
};
startPlay(c320);
};
function startPlay(constraints) {
stopStream();
clearMsg();
videoblock.style.display = 'none';
navigator.mediaDevices.getUserMedia(constraints)
.then(gotStream)
.catch(e => {
showErrMsg('getUserMedia报错 ' + e, JSON.stringify(constraints));
});
}
function stopStream() {
if (stream) {
stream.getTracks().forEach(track => {
track.stop();
});
}
}
- 定义配置
c320,设定宽为320,高伟240 - 先把视频停下来
- 调用
getUserMedia并把参数配置传进去
还可以监听video的变化
let currentWidth = 0;
let currentHeight = 0;
// 显示视频尺寸信息
function displayVideoDimensions(whereSeen) {
if (video.videoWidth) {
dimensionsInfo.innerText = '实际video尺寸: ' + video.videoWidth +
'x' + video.videoHeight + 'px.';
if (currentWidth !== video.videoWidth ||
currentHeight !== video.videoHeight) {
console.log(whereSeen + ': ' + dimensionsInfo.innerText);
currentWidth = video.videoWidth;
currentHeight = video.videoHeight;
}
} else {
dimensionsInfo.innerText = '拿不到video的宽度';
}
}
// 载入meta信息
video.onloadedmetadata = () => {
displayVideoDimensions('loadedmetadata');
};
// 修改了尺寸
video.onresize = () => {
displayVideoDimensions('resize');
};
载入信息或者尺寸改变的时候显示出来。
定义了多种常见的分辨率
document.querySelector('#b640').onclick = () => {
const c640 = {
video: { width: { exact: 640 }, height: { exact: 480 } }
};
startPlay(c640);
};
document.querySelector('#b1280').onclick = () => {
const c1280 = {
video: { width: { exact: 1280 }, height: { exact: 720 } }
};
startPlay(c1280);
};
滑动调整
我们放置了一个input,type="range",它可以左右滑动。滑动的时候我们改变视频设置的宽度。宽度信息也显示在界面上。
widthInput.onchange = onConstraintChange;
function onConstraintChange(e) {
widthOutput.textContent = e.target.value;
const track = window.stream.getVideoTracks()[0];
let constraints;
if (aspectLock.checked) {
constraints = {
width: { exact: e.target.value },
aspectRatio: {
exact: video.videoWidth / video.videoHeight
}
};
} else {
constraints = { width: { exact: e.target.value } };
}
clearMsg();
console.log('使用配置 ' + JSON.stringify(constraints));
track.applyConstraints(constraints)
.then(() => {
console.log('配置成功');
displayVideoDimensions('applyConstraints');
})
.catch(err => {
showErrMsg('配置失败 ', err.name);
});
}
改变的宽度写在constraints里,注意需要指定exact参数。
window.stream.getVideoTracks()[0]获取到track(视频轨)。
调用track.applyConstraints(constraints)让修改后的参数生效。同样这里可以监听配置是否成功。
点不同的按钮,可以看到视频的尺寸不同。
在电脑显示器上测试,选择尺寸过大时,会报错OverconstrainedError。
小结
本次示例也是getUserMedia()方法的使用。前面打开摄像头我们只指定了video: true。在这个示例里我们指定了宽高信息。并以此控制输出的视频分辨率。
视频正在显示的时候,也可以用track.applyConstraints方法来修改视频的分辨率。
效果
网页效果预览
原文链接WebRTC视频分辨率设置
WebRTC视频分辨率设置的更多相关文章
- WebRTC 视频对话
今天聊一下WebRTC.很多开发者,可能会觉得有些陌生,或者直接感觉繁杂.因为WebRTC在iOS上的应用,只是编译都让人很是头痛.这些话,到此为止,以防让了解者失去信心.我们只传播正能量,再多的困难 ...
- webrtc 视频 demo
webrtc 视频 demo webrtc网上封装的很多,demo很多都是一个页面里实现的,今天实现了个完整的 , A 发视频给 B A webrtc.html作为offer <!DOCTYPE ...
- Android IOS WebRTC 音视频开发总结(七五)-- WebRTC视频通信中的错误恢复机制
本文主要介绍WebRTC视频通信中的错误恢复机制(我们翻译和整理的,译者:jiangpeng),最早发表在[这里] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blac ...
- vbox下android分辨率设置
VBoxManage setextradata "android" "CustomVideoMode1" "1280x800x16" 1. ...
- Unity 开发游戏Game分辨率设置
最近自己开发小游戏,突然又被Game视图中设置分辨率被诱惑了, 我到底该怎么设置分辨率设置的图片才能让电脑和手机尺寸显示的大小一模一样呢? 然后又被手机尺寸和分辨率迷惑了! =.= 越搞越混 分辨 ...
- 5分钟快速打造WebRTC视频聊天<转>
原文地址: 5分钟快速打造WebRTC视频聊天 百度一下WebRTC,我想也是一堆.本以为用这位朋友( 搭建WebRtc环境 )的SkyRTC-demo 就可以一马平川的实现聊天,结果折腾了半天,文本 ...
- vmware下Ubuntu屏幕分辨率设置
1.查看现有设备 xrandr -q 输出如下: Screen 0: minimum 1 x 1, current 800 x 600, maximum 8192 x 8192 Virtual1 co ...
- 关于OV7670摄像头的分辨率设置
关于OV7670摄像头的分辨率设置最近一直在纠结如何把OV7670输出的图片分辨率缩小,以减少数据量来适应数据的传输,在网上看了好多也没有关于寄存器的具体设置,最终又读了几遍数据手册,加上网友们写的帖 ...
- Linux系统分辨率设置
linux 设置分辨率 如果你需要在linux上设置显示屏的分辨率,分两种情况:分辨率模式存在与分辨率模式不存在,具体如下. 1,分辨率模式已存在 1)如何查询是否存在: 图形界面:在System S ...
随机推荐
- 从四个方向分析我们可以从linux学到什么
我们真正关心的是自身可以从这个生态圈中获得些什么?说得更直白一点就是,我们可以从linux系统上面学到点什么,它对我们个人的成长和发展有哪些积极的因素.个人觉得,完全可以通过下面四个维度并结合自己的兴 ...
- 聊聊@Transactional 的失效场景,有哪些坑?
先别急着回答,看完再说也不迟嘛.我们都知道在 Spring 项目中,我们可以直接使用注解 @Transactional 来标识一个事务方法.然而,你可能并不知道这个事务是不是按照你想的方式执行.下面我 ...
- (二)lamp环境搭建之编译安装mysql
mysql 编译安装1,在网站上下载: wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.15.tar.gz 2,安装cmake ...
- Mysql 5.7 集群部署,keepalived
参考文章: https://blog.csdn.net/f18770366447/article/details/80703347 https://www.cnblogs.com/benjamin77 ...
- 【高并发】深入解析Callable接口
大家好,我是冰河~~ 本文纯干货,从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小. 1.Callable接口介绍 Callable接口是J ...
- RocketMQ源码详解 | Broker篇 · 其三:CommitLog、索引、消费队列
概述 上一章中,已经介绍了 Broker 的文件系统的各个层次与部分细节,本章将继续了解在逻辑存储层的三个文件 CommitLog.IndexFile.ConsumerQueue 的一些细节.文章最后 ...
- 几个简单的文本处理工具:diff,patch,grep,cut,sort,tr
1:文本处理工具: 1:diff and patch : diff是比较文件或者目录的不同,主要有3个用法: diff file1 file2 :比较file1和file2的不同:diff -u ...
- SpringCloud概念
SpringCloud概述 1.SpringCloud是什么? 官方解释: 官网: https://spring.io/projects/spring-cloud/ SpringCloud是一系列 ...
- 02-Java中的锁详解
I. 使用Lock接口 只要不涉及到复杂用法,一般采用的是Java的synchronized机制 不过,Lock可以提供一些synchronized不支持的机制 非阻塞的获取锁:尝试获取锁,如果能获取 ...
- 用 python 解决线性代数中的矩阵运算
用 python 解决线性代数中的矩阵运算 矩阵叉乘 矩阵求逆 矩阵转置 假定AX=B,求解未知矩阵X 矩阵的行列式值|matrix| 未完待续..... import sys from PyQt5. ...