WebRTC视频分辨率设置

news/2024/12/29 21:36:35/

html#
在页面上摆放一些元素,下面是主要部分

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

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

}
亚马逊测评 www.yisuping.cn


http://www.ppmy.cn/news/907318.html

相关文章

【蓝桥杯嵌入式(G431-HAL库)】LCD

【备赛蓝桥杯嵌入式&#xff08;G431-HAL库&#xff09;】LCD 01 基本使用 从资源包里拷贝lcd.h和lcd.c进入工程文件 //初始化&#xff0c;颜色自定 //LCD长宽为240x320 LCD_Init(); LCD_Clear(Black); LCD_SetBackColor(Black); LCD_SetTextColor(White);//按行显示 LCD_Di…

【f1c200s/f1c100s】RGB接口 LCD驱动适配

【f1c200s/f1c100s】RGB接口 LCD驱动适配 RGB模式介绍F1C200s/F1C100s RGB LCD驱动适配设备树修改源码修改结果 RGB模式介绍 RGB 模式就是我们通过说的 RGB 屏&#xff0c;以 RGB&#xff08;TTL 信号&#xff09;并行数据线传输&#xff0c;广泛的应用于 5 寸及以上的 TFT-LC…

esp32 TFT_eSPI库 屏幕显示不全,颜色错误的解决方案

esp32 TFT_eSPI库 屏幕显示不全&#xff0c;颜色错误的解决方案 打开Arduino库文件目录&#xff0c;找到TFT_eSPI文件夹&#xff0c;打开如图片所示的目录 st7789 135x240 和 240x240屏幕 可以在Setup136_Lilygo_TTV.h中修改尺寸&#xff0c;在下面修改SPI速度为80M st7789 2…

AT32(五):硬件SPI——驱动LCD屏的一些尝试

总感觉之前的AT32F421板子/片子 有点小毛病&#xff0c;出各种莫名其妙的BUG&#xff08;实在找不出软件的问题&#xff0c;只能怀疑是硬件 QAQ&#xff09;。 于是之后咕了很久&#xff0c;最近终于想继续折腾&#xff0c;拿AT32F435画了一块LCD驱动板&#xff0c;准备入坑LV…

树莓派 python 驱动 lcd tft spi 2.8寸 ili9341 240x320

树莓派 python 驱动 lcd tft spi 2.8寸 ili9341 240x320 1. 驱动效果2. 屏幕及接线3. python驱动代码 1. 驱动效果 娃开车图 2. 屏幕及接线 屏幕我某宝直接购买的&#xff0c;价钱31.5 接线图&#xff1a; 3. python驱动代码 写的不严谨&#xff0c;但是能驱动&#xf…

ESP32-S2 st7789 SPI TFT彩屏240X320

例子乐鑫官方 esp-iot-solution/examples/hmi/lvgl_example 点左下角齿轮&#xff08;SDK Configuration Editor&#xff09;选择开发板为 Saola With Esp32S2 Onboard From Espressif 设置USB输出调试文字 修改头文件中引脚&#xff1a; D:\esp-iot-solution\examples\commo…

[stm32] 一个简单的stm32vet6驱动2.4寸240X320的8位并口tft屏DEMO

书接上文: 最近在研究用低速、低RAM的单片机来驱动小LCD或TFT彩屏实现动画效果 首先我用一个16MHz晶振的m0内核的8位单片机nRF51822尝试驱动一个1.77寸的4线SPI屏(128X160), 发现,刷一屏大约要0.8s左右的时间, 具体收录在《1、一个简单的nRF51822驱动的天马4线SPI-1.77寸…

基于rt-thread与stm32f405rgt6驱动 240x320的st7789v TFT屏

步骤一 到https://gitee.com/rtthread/rt-thread/tree/gitee_master/bsp/stm32/stm32l475-atk-pandora/board/ports/lcd 中拷贝drv_lcd.c , drv_lcd.h&#xff0c; lcd_font.h文件到工程中&#xff0c; 步骤二修改LCD_Driver.c文件部分内容 根据个人的硬件电路修改引脚&…