当前位置:   article > 正文

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

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分辨率。

  1. //高清约束条件
  2. const hdconstraints={
  3. video :{ width: { exact: 1280 },height: { exact: 720} }
  4. }

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

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

  1. //QVGA320*240
  2. const qvgaConstraints={video: { width: {exact: 320},height: {exact: 240}}}

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

  1. //根据约束获取视频
  2. getMedia=(constraints)=>{
  3. //判断流对象是否为空
  4. if(stream){
  5. stream.getTracks().forEach(function(track) {
  6. track.stop();
  7. });
  8. }
  9. //重新获取视频
  10. navigator.mediaDevices.getUserMedia(constraints)
  11. .then(this.gotStream)
  12. .catch(this.handleError)
  13. }

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

  1. //得到视频处理
  2. gotStream=(mediaStream)=>{
  3. //使得浏览器能访问到stream
  4. window.stream=mediaStream;
  5. //将stream绑定到video标签
  6. video.srcObject=mediaStream;
  7. const track=mediaStream.getVideoTracks()[0];
  8. const constraints=track.getConstraints();
  9. console.log('约束条件为:' +JSON.stringify(constraints) );
  10. }

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

  1. //下拉列表框中的选项改变
  2. handleChange=(value)=>{
  3. console.log(`Selected: ${value}`);
  4. switch(value){
  5. case 'qvga':
  6. this.getMedia(qvgaConstraints);
  7. break;
  8. case 'vga':
  9. this.getMedia(vgaConstraints);
  10. break;
  11. case 'hd':
  12. this.getMedia(hdConstraints);
  13. break;
  14. case 'fullhd':
  15. this.getMedia(fullHdConstraints);
  16. break;
  17. case '2k':
  18. this.getMedia(twoKConstraints);
  19. break;
  20. case '4k':
  21. this.getMedia(fourKConstraints);
  22. break;
  23. case '8k':
  24. this.getMedia(eightKConstraints);
  25. break;
  26. default:
  27. break;
  28. }
  29. }

(5)动态改变分辨率.

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

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

完整代码如下所示:

  1. import React,{ Component } from 'react'
  2. import {Button,Select} from 'antd'
  3. import '../public/styles.css'
  4. const {Option}=Select;
  5. //约束条件
  6. //QVGA320*240
  7. const qvgaConstraints={video: { width: {exact: 320},height: {exact: 240}}}
  8. //VGA 640*480
  9. const vgaConstraints={video: { width: {exact: 640},height: {exact: 480}}}
  10. //HD 1280*720
  11. const hdConstraints={video: { width: {exact: 1280},height: {exact: 720}}}
  12. //FHD 1920*1080
  13. const fullHdConstraints={video: { width: {exact: 1920},height: {exact: 1080}}}
  14. //2K 2048*1080
  15. const twoKConstraints={video: { width: {exact: 2048},height: {exact: 1080}}}
  16. //4K 3840*2160
  17. const fourKConstraints={video: { width: {exact: 3840},height: {exact: 2160}}}
  18. //8K 7680*4320
  19. const eightKConstraints={video: { width: {exact: 7680},height: {exact: 4320}}}
  20. //视频流
  21. let stream;
  22. //视频对象
  23. let video;
  24. /**
  25. * 摄像头使用示例
  26. */
  27. class Resolution extends Component {
  28. componentDidMount(){
  29. video=document.getElementById('video');
  30. navigator.mediaDevices.getUserMedia(vgaConstraints)
  31. .then(this.gotStream)
  32. .catch(this.handleError)
  33. }
  34. //根据约束获取视频
  35. getMedia=(constraints)=>{
  36. //判断流对象是否为空
  37. if(stream){
  38. stream.getTracks().forEach(function(track) {
  39. track.stop();
  40. });
  41. }
  42. //重新获取视频
  43. navigator.mediaDevices.getUserMedia(constraints)
  44. .then(this.gotStream)
  45. .catch(this.handleError)
  46. }
  47. //得到视频处理
  48. gotStream=(mediaStream)=>{
  49. //使得浏览器能访问到stream
  50. window.stream=mediaStream;
  51. //将stream绑定到video标签
  52. video.srcObject=mediaStream;
  53. const track=mediaStream.getVideoTracks()[0];
  54. const constraints=track.getConstraints();
  55. console.log('约束条件为:' +JSON.stringify(constraints) );
  56. }
  57. handleError=(error)=>{
  58. console.log('获取视频失败:' + error);
  59. }
  60. //下拉列表框中的选项改变
  61. handleChange=(value)=>{
  62. console.log(`Selected: ${value}`);
  63. switch(value){
  64. case 'qvga':
  65. this.getMedia(qvgaConstraints);
  66. break;
  67. case 'vga':
  68. this.getMedia(vgaConstraints);
  69. break;
  70. case 'hd':
  71. this.getMedia(hdConstraints);
  72. break;
  73. case 'fullhd':
  74. this.getMedia(fullHdConstraints);
  75. break;
  76. case '2k':
  77. this.getMedia(twoKConstraints);
  78. break;
  79. case '4k':
  80. this.getMedia(fourKConstraints);
  81. break;
  82. case '8k':
  83. this.getMedia(eightKConstraints);
  84. break;
  85. default:
  86. break;
  87. }
  88. }
  89. //动态改变分辨率
  90. dynamicChange=(e)=>{
  91. //获取视频流中的视频轨道
  92. const track=window.stream.getVideoTracks()[0];
  93. //使用超清约束作为测试条件
  94. console.log('应用高清效果'+JSON.stringify(hdConstraints));
  95. track.applyConstraints(hdConstraints)
  96. .then(()=>{console.log('应用高清效果成功')})
  97. .catch((error)=>{console.log('应用高清效果失败'+error)})
  98. }
  99. render() {
  100. return (
  101. <div className='container'>
  102. <h1><span>视频分辨率示例</span></h1>
  103. <video className='video' id='video' playsInline autoPlay></video>
  104. <Select
  105. defaultValue='vga'
  106. style={{ width: 120, marginLeft: 20 }}
  107. onChange={this.handleChange}
  108. >
  109. <Option value='qvga'>QVGA</Option>
  110. <Option value='vga'>VGA</Option>
  111. <Option value='hd'>高清</Option>
  112. <Option value='fullhd'>超清</Option>
  113. <Option value='2k'>2K</Option>
  114. <Option value='4k'>4K</Option>
  115. <Option value='8k'>8K</Option>
  116. </Select>
  117. <Button type="primary" onClick={this.dynamicChange} style={{marginLeft: 20}}>动态设置</Button>
  118. </div>
  119. )
  120. }
  121. }
  122. export default Resolution

2、其它设置

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

  1. //创建AudioContext用于管理和播放所有声音
  2. window.AudioContext=window.AudioContext || window.webkitAudioContext
  3. //实例化对象
  4. window.audioContext=new AudioContext()

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

var enumeratorPromise=navigator.mediaDevices.enumerateDevices();

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

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

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

        label: 设备名称

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/1007933
推荐阅读
相关标签
  

闽ICP备14008679号