WebRTC基础实践 - 4. 获取摄像头的视频流

本节内容

在本节课程中, 我们将学习以下知识点:

  • 从摄像头(webcam)获取视频流(video stream)
  • 控制视频内容的回显
  • 通过CSS和SVG处理视频内容。

本节的完整版代码位于 step-01 文件夹中。

HTML代码

work 目录下的 index.html 文件中, 增加 video 标签和 script 标签:

<!DOCTYPE html>
<html>
<head>
  <title>Realtime communication with WebRTC</title>
  <link rel="stylesheet" href="css/main.css" />
</head>

<body>
  <h1>Realtime communication with WebRTC</h1>
  <!-- 增加的代码在下面这里: -->
  <video autoplay playsinline></video>
  <script src="js/main.js"></script>
</body>

</html>

注意: 如果有中文字符, 则 .html 文件需要使用 UTF-8 编码保存/另存。

JavaScript代码

js 目录下的 main.js 文件中, 加入以下的代码:

'use strict';

// 本节只需要使用到 video (video: true).
const mediaStreamConstraints = {
  video: true
};

// 用于播放视频流stream 的 video元素.
const localVideo = document.querySelector('video');

// Local stream that will be reproduced on the video.
let localStream;

// success 处理函数;  by adding the MediaStream to the video element.
function gotLocalMediaStream(mediaStream) {
  localStream = mediaStream;
  localVideo.srcObject = mediaStream;
}

// error 处理函数;  将 error 信息打印到 console.
function handleLocalMediaStreamError(error) {
  console.log('navigator.getUserMedia error: ', error);
}

// 初始化 media stream.
navigator.mediaDevices.getUserMedia(mediaStreamConstraints)
  .then(gotLocalMediaStream).catch(handleLocalMediaStreamError);

本教程中的 JavaScript 代码, 都在起始处加上 'use strict'; ,这样可以避免很多新手经常碰到的编程错误。

关于严格模式的更多信息, 请参考 ECMAScript 5 Strict Mode, JSON, and More

运行示例

在浏览器中打开对应的 index.html 页面, 效果类似如下:

在这里插入图片描述

当然, 页面中展示的你本地摄像头实时拍摄到的内容。

原理解析

navigator.mediaDevices.getUserMedia(mediaStreamConstraints)
  .then(gotLocalMediaStream).catch(handleLocalMediaStreamError);

}

调用 getUserMedia() 方法之后, 浏览器会判断当前域名(domain)是否具有调用摄像头的权限, 如果是第一次请求授权, 则会弹出对话框, 要求用户手动选择允许。 如下图所示:

在这里插入图片描述

如果权限验证通过, 则返回 MediaStream 对象, 可以将该对象赋值给 media 元素的 srcObject 属性:

function gotLocalMediaStream(mediaStream) {
  localVideo.srcObject = mediaStream;
}

参数 constraints 可以指定要获取哪些 media 信息。如果不指定, 声音(audio) 默认配置是禁用的, 所以此处实际上只获取了 video 流:

const mediaStreamConstraints = {
  video: true
};

还可以加上更多的约束条件, 例如设置视频分辨率:

const hdConstraints = {
  video: {
    width: {
      min: 1280
    },
    height: {
      min: 720
    }
  }
}

MediaTrackConstraints 规范文档 列出了所有可用的约束类型, 虽然有一些浏览器不兼容其中的某些选项。如果当前选择的摄像头不支持给定的约束选项, 调用 getUserMedia() 时则会抛出 OverconstrainedError 错误。默认也不会提示用户进行再次授权。

当然, 用户随时可以管理授权信息, 或者切换摄像头, 如下图所示:

在这里插入图片描述

各个版本的浏览器界面可能略有不同, 但应该都能找到管理授权的地方。搞不定的就上网搜索。

关于限制不同分辨率的demo, 请参考 https://simpl.info/getusermedia/constraints/, 选择摄像头和麦克风的demo请参考: https://simpl.info/getusermedia/sources/

如果 getUserMedia() 调用成功, 则将摄像头传过来的视频流, 作为 video 的来源:

function gotLocalMediaStream(mediaStream) {
  localVideo.srcObject = mediaStream;
}

练习与实践

  • 此处 localStream 是一个全局变量, 所以可以通过 console 来查看: 打开浏览器控制台, 输入 localStream 并按回车。 (打开控制台的方式: Windows系统按F12并选择; 或者组合快捷键: Ctrl-Shift-J; Mac系统则是 Command-Option-J)。
  • localStream.getVideoTracks() 返回的是什么值呢?
  • 查看 constraints 对象: 如果设置为 {audio: true, video: true}, 有什么效果呢?
  • video 元素的大小是多少? 如何通过JavaScript获得视频的原生尺寸? 而不是仅仅获取显示出来的尺寸? 尝试使用 Chrome开发工具来查看相关API。
  • 尝试对 video 元素添加 CSS 过滤器。例如:
video {
  filter: blur(4px) invert(1) opacity(0.5);
}
  • 尝试添加SVG过滤器。例如:
video {
   filter: hue-rotate(180deg) saturate(200%);
}

知识点回顾

在本节课程中, 我们学到了:

  • 从网络摄像头获取视频。
  • 设置媒体约束条件(media constraint)。
  • 混合视频元素。

本节的完整版代码位于 step-01 文件夹中。

提示

最佳实践

  • 请确保 video 元素的内容不会溢出包裹容器。通过 widthmax-width 样式可以设置 video 的默认尺寸、最大尺寸。 浏览器会自动计算对应的 height 属性:
video {
  max-width: 100%;
  width: 320px;
}

后续内容

既然获取到了 video, 那要如何使用呢? 我们将在下一小节讲解!

原文链接: https://codelabs.developers.google.com/codelabs/webrtc-web/#3

翻译人员: 铁锚 - https://blog.csdn.net/renfufei

翻译日期: 2018年07月04日

WebRTC基础实践 系列文章目录如下:

### 使用 WebRTC-Streamer 实现本地摄像头推流 为了使用 WebRTC-Streamer 实现本地摄像头的推流,需按照特定流程设置环境并调整配置文件。WebRTC-Streamer 是一种用于播放 RTSP 流的技术,在 Windows 平台上部署时,建议先安装对应版本的应用程序[^1]。 #### 下载与解压软件包 从官方 GitHub 发布页面获取适用于 Windows 的最新版 `webrtc-streamer` 压缩包(如 `webrtc-streamer-v0.7.0-dirty-Windows-AMD64-Release.tar.gz`),将其下载到目标机器上,并利用合适的工具完成解压缩操作。 #### 配置摄像头取流地址 对于希望推送至网络中的本地 USB 或内置摄像头设备而言,通常不需要指定复杂的 RTSP URL;相反,应该关注于正确识别这些硬件资源的方式。如果打算测试来自 IP 摄像头或其他远程源的内容,则仍需提供相应的 RTSP 地址给应用程序处理。 针对本地物理连接的摄像装置,默认情况下可通过 V4L2 (Video4Linux 2) 接口访问 Linux 系统下的此类外设,但在 Windows 上则可能依赖 DirectShow 或 Media Foundation API 来捕获图像帧数据。因此,当涉及到非标准输入端点时,请查阅相关文档以确认最佳实践方案。 假设当前仅考虑简单的场景——即直接读取本机已知编号的视频捕捉卡或集成 webcam 输出: ```ini # Example configuration snippet for accessing a local camera on Windows using DirectShow [Camera] ; Use 'DirectShow' as the capture method and specify device index or friendly name here. device=DirectShow:0 ; Replace with actual device identifier if necessary. [RTSPServer] enabled=true port=8554 ; Choose an available port number that does not conflict with existing services. path=/camera ; Define path under which clients can request this stream via HTTP/HTTPS protocol. ``` 上述 INI 文件片段展示了如何定义一个基于 DirectShow 技术抓取本地影像信号并向外界暴露 RESTful API 访问接口的方法。请注意替换示例值为实际环境中适用的信息项。 #### 启动服务进程 保存修改后的参数设定之后,可以通过命令提示符或者 PowerShell 执行可执行文件启动 WebRTC Streamer 服务实例。确保防火墙规则允许外部请求到达选定监听端口号之上。 ```powershell .\webrtc-streamer.exe --config .\streamer.conf ``` 此时应当能够通过浏览器或者其他兼容客户端尝试建立 WebSocket 连接并与之交互,从而观看由所选摄录单元产生的实况画面传输效果。 #### 调试与验证 一旦成功建立了会话链接,便可以在开发者控制台观察日志输出来排查潜在错误消息或是性能瓶颈所在之处。此外,也可以借助 Wireshark 等抓包分析工具辅助诊断整个通信链路的工作状态是否正常运作。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值