WebRTC音视频开发读书笔记(二)

四、音视频设置

访问设备后,可以采集到音频或视频数据,对于视频,希望能控制分辨率,对于音频,希望能检测疸大小。另外,浏览器navigator.mediaDevices对象提供了用于设备媒体的方法,其相关API如表所示:

1、视频分辨率设置

(1)分辨率概述

视频分辨率是指视频所成图像内包含的像素数量.通常视频在同样大小的屏幕下,分辨率越高,所包含的像素就越多,视频画面就越细腻、越清晰。

常见分

QVGA:  320*240

VGA: 640*480

高清720P: 1280*720

超清1080P: 1920*1080

2K: 2560*1440

4K: 4096*2160

8K: 7680*4320

(2)分辨率设置

在WebRTC中,分辨率的设置是通过获取视频时传递约束条件来控制,如下面所示,要设置成一个720P的分辨率,当调用getUserMedia()时会采用720P分辨率。

javascript 复制代码
//高清约束条件
const hdconstraints={
     video :{ width: { exact: 1280 },height: { exact: 720} }
}

,下面通过示例简介分辨率设置,其主要步骤如下:

(1)添加约束各分辨率的约束条件.

javascript 复制代码
//QVGA320*240
const qvgaConstraints={video: { width: {exact: 320},height: {exact: 240}}}

(2) 编写根据不同的约束条件获取视频流的方法,,在重新获取视频后, 需要把当前stream里的所有流都停止,流中通常有多个轨道,可以使用forEach将其所有轨道迭代并调用stop方法停止.,

javascript 复制代码
 //根据约束获取视频
    getMedia=(constraints)=>{
        //判断流对象是否为空
        if(stream){
            stream.getTracks().forEach(function(track) {
                track.stop();
            });
        }
        //重新获取视频
        navigator.mediaDevices.getUserMedia(constraints)
        .then(this.gotStream)
        .catch(this.handleError)
    }

(3) 获取媒体流后,将媒体流传递给video对象渲染

javascript 复制代码
 //得到视频处理
    gotStream=(mediaStream)=>{
        //使得浏览器能访问到stream
        window.stream=mediaStream;
        //将stream绑定到video标签
        video.srcObject=mediaStream;  
        const  track=mediaStream.getVideoTracks()[0];
        const  constraints=track.getConstraints();
        console.log('约束条件为:' +JSON.stringify(constraints) );   
    }

(4)编写下拉列表回调方法,根据选中的项传递不同的约束.

javascript 复制代码
 //下拉列表框中的选项改变
    handleChange=(value)=>{
        console.log(`Selected: ${value}`);
        switch(value){
            case 'qvga':
                this.getMedia(qvgaConstraints);
                break;
            case 'vga':
                this.getMedia(vgaConstraints);
                break;
            case 'hd':
                this.getMedia(hdConstraints);
                break;
            case 'fullhd':
                this.getMedia(fullHdConstraints);
                break;
            case '2k':
                this.getMedia(twoKConstraints);
                break;
            case '4k':
                this.getMedia(fourKConstraints);
                break;
            case '8k':
                this.getMedia(eightKConstraints);
                break;
            default:  
                break;
        }
    }

(5)动态改变分辨率.

javascript 复制代码
 //动态改变分辨率
    dynamicChange=(e)=>{
        //获取视频流中的视频轨道
        const  track=window.stream.getVideoTracks()[0];
        //使用超清约束作为测试条件
        console.log('应用高清效果'+JSON.stringify(hdConstraints));
        track.applyConstraints(hdConstraints)
        .then(()=>{console.log('应用高清效果成功')})
        .catch((error)=>{console.log('应用高清效果失败'+error)})
    }

(6)在页面添加video标签,分辨率下拉列表框等界面元素.

完整代码如下所示:

javascript 复制代码
import React,{ Component } from 'react'
import {Button,Select} from 'antd'
import '../public/styles.css'

const {Option}=Select;

//约束条件
//QVGA320*240
const qvgaConstraints={video: { width: {exact: 320},height: {exact: 240}}}
//VGA 640*480
const vgaConstraints={video: { width: {exact: 640},height: {exact: 480}}}
//HD 1280*720
const hdConstraints={video: { width: {exact: 1280},height: {exact: 720}}}
//FHD 1920*1080
const fullHdConstraints={video: { width: {exact: 1920},height: {exact: 1080}}}
//2K 2048*1080
const twoKConstraints={video: { width: {exact: 2048},height: {exact: 1080}}}
//4K 3840*2160
const fourKConstraints={video: { width: {exact: 3840},height: {exact: 2160}}}
//8K 7680*4320
const eightKConstraints={video: { width: {exact: 7680},height: {exact: 4320}}}

//视频流
let stream;
//视频对象
let video;

/**
 * 摄像头使用示例
 */
class Resolution extends Component {
    componentDidMount(){
        video=document.getElementById('video');
        navigator.mediaDevices.getUserMedia(vgaConstraints)
        .then(this.gotStream)
        .catch(this.handleError)
    }

    //根据约束获取视频
    getMedia=(constraints)=>{
        //判断流对象是否为空
        if(stream){
            stream.getTracks().forEach(function(track) {
                track.stop();
            });
        }
        //重新获取视频
        navigator.mediaDevices.getUserMedia(constraints)
        .then(this.gotStream)
        .catch(this.handleError)
    }
   
    //得到视频处理
    gotStream=(mediaStream)=>{
        //使得浏览器能访问到stream
        window.stream=mediaStream;
        //将stream绑定到video标签
        video.srcObject=mediaStream;  
        const  track=mediaStream.getVideoTracks()[0];
        const  constraints=track.getConstraints();
        console.log('约束条件为:' +JSON.stringify(constraints) );   
    }

    handleError=(error)=>{
       console.log('获取视频失败:' + error);      
    }

    //下拉列表框中的选项改变
    handleChange=(value)=>{
        console.log(`Selected: ${value}`);
        switch(value){
            case 'qvga':
                this.getMedia(qvgaConstraints);
                break;
            case 'vga':
                this.getMedia(vgaConstraints);
                break;
            case 'hd':
                this.getMedia(hdConstraints);
                break;
            case 'fullhd':
                this.getMedia(fullHdConstraints);
                break;
            case '2k':
                this.getMedia(twoKConstraints);
                break;
            case '4k':
                this.getMedia(fourKConstraints);
                break;
            case '8k':
                this.getMedia(eightKConstraints);
                break;
            default:  
                break;
        }
    }
    //动态改变分辨率
    dynamicChange=(e)=>{
        //获取视频流中的视频轨道
        const  track=window.stream.getVideoTracks()[0];
        //使用超清约束作为测试条件
        console.log('应用高清效果'+JSON.stringify(hdConstraints));
        track.applyConstraints(hdConstraints)
        .then(()=>{console.log('应用高清效果成功')})
        .catch((error)=>{console.log('应用高清效果失败'+error)})
    }

    render() {
        return (
            <div className='container'>
                <h1><span>视频分辨率示例</span></h1>
                <video  className='video'  id='video'  playsInline autoPlay></video>
                <Select
                    defaultValue='vga'
                    style={{ width: 120, marginLeft: 20 }}
                    onChange={this.handleChange}
                >
                    <Option value='qvga'>QVGA</Option>
                    <Option value='vga'>VGA</Option>
                    <Option value='hd'>高清</Option>
                    <Option value='fullhd'>超清</Option>
                    <Option value='2k'>2K</Option>
                    <Option value='4k'>4K</Option>
                    <Option value='8k'>8K</Option>
                </Select>
                <Button type="primary" onClick={this.dynamicChange} style={{marginLeft: 20}}>动态设置</Button>
            </div>
        )
    }
}

export default Resolution

2、其它设置

音频设置: 主要是使用HTML5有关音频处理的重要接口AudioContext,工作原理是将AudioContext创建出来的各种节点AudioNode相互连接,音频数据流经这些节点并作相应处理.。AudioContext可以控制它所包含的音频处理、解码操作的执行。示例代码如下:

javascript 复制代码
//创建AudioContext用于管理和播放所有声音
window.AudioContext=window.AudioContext || window.webkitAudioContext
//实例化对象
window.audioContext=new AudioContext()

设备枚举: 使用MediaDevices的方法enumerateDevices()可请求一个输入和输出设备的列表,语法如下:

javascript 复制代码
var enumeratorPromise=navigator.mediaDevices.enumerateDevices();

代码执行后返回一个Promise,当完成时,Promise接收一个MediaDeviceInfo对象数组,每个对象描述一个可用的媒体输入输出设备,如果枚举失败,Promise也会被拒绝。MediaDeviceInfo包含了设备的几个重要信息,如下所示:

deviceId: 设备Id,唯一字符串区分不同的硬件设备.

kind: 设备类型,视频输入设备videoinput,音频输入设备audioinput,音频输出设备audiooutput

label: 设备名称

相关推荐
海边捡石子2 小时前
从零设计一个通用智能电话平台:FreeSWITCH + ESL + AI 实战架构
人工智能·架构·webrtc
hflmwl87 小时前
Wise Data Recovery找回误删的文档照片音乐和视频
音视频·datarecovery·找回误删的文档照片音乐和视频·找回误删的文档照片音乐视频
技灵AI7 小时前
AI 视频转场提示词怎么写?让前后画面衔接更自然
人工智能·prompt·aigc·音视频
youandyouyou9 小时前
跨区培训的屏幕共享怎么做才稳?同屏同步与弱网优化实践
音视频·网络通信
开开心心就好9 小时前
课堂随机点名工具,绿色版免安装双击即用
java·服务器·前端·ffmpeg·音视频·perl·symfony
美狐美颜SDK开放平台10 小时前
直播APP集成美颜SDK,如何梳理第三方组件的数据权限?
开发语言·人工智能·深度学习·音视频·第三方美颜sdk
l143723326711 小时前
批量视频硬字幕擦除多少钱?影响报价的关键因素全解析
音视频
重生六道11 小时前
B站视频时长统计:一段JS脚本搞定分P/合集总时长(附倍速计算)
开发语言·javascript·音视频
音视频牛哥12 小时前
不换摄像机,也能接入 WebRTC?SmartMediaKit RTSP/RTMP 转 WHIP 技术实践
音视频·webrtc·smartmediakit·rtsp转whip·rtmp转whip·whip推流·rtsp转webrtc播放
lll235269177912 小时前
Android APP短视频音频提取,主流工具怎么选
ffmpeg·音视频