当前位置:首页 > 技术文章 > 正文内容

WebRTC 如何推送本地视频流(webrtc视频流传输)

一、需求

使用 webrtc 协议做直播,常见的音视频源是摄像头和麦克风,高级一点的就是桌面分享。虽然使用桌面分享可以实现推送本地流(原理就是对屏幕录制),但依赖本地播放器,并且观众可以看到主播的任何操作。

有一种伪直播需求,需要将本地视频无感知推送给用户,让用户感觉就像直播一样。

使用webrtc协议,大多数情况是在浏览器中做主播端。众所周知,出于安全和隐私的原因,Web 应用程序不能直接访问用户设备上的文件。那么如何将本地视频源进行加载到浏览器并推送出去呢?

二、核心API

HTMLCanvasElement.captureStream()

该方法返回一个CanvasCaptureMediaStream实时视频捕获的画布。

使用例子:

//获取所需要截取媒体流的canvas element
var canvasElt = document.querySelector('canvas'); // 或者 video 标签

//截取到媒体流
var stream = canvasElt.captureStream(25); // 25 FPS

//使用媒体流
// E.g.使用RTCPeerConnection来传输给其它的电脑
// 下面的pc是其他地方创建的一个RTCPeerConnection
pc.addStream(stream);

通过以上例子,是不是恍然大雾。

此时我们的方案可以是:

  1. 上传一段视频到服务器或者云存储
  2. 使用 video 标签加载视频
  3. 使用 captureStream 捕获视频流
  4. 使用 addStream 将视频流发布

此时解决了推送视频流,但是要推送本地视频怎么做呢?

相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】

音视频免费学习地址:
FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

三、最终解决方案

出于安全和隐私的原因,Web 应用程序不能直接访问用户设备上的文件。如果需要读取一个或多个本地文件,可以通过使用 input fileFileReader 来实现。虽然 FileReader 可以读文件,但是需要经过base-64编码,如果读大文件肯定会影响效率。所以我们只能考虑 input file, 可以使用 URL.createObjectURL 对视频进行预览。

那么我的最终方案就是使用 captureStream + input file预览 模式来解决这个问题。

简要代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</head>

<body>
    <video width="500" controls>
        <source src="my_video.mp4" id="video_here">
    </video>
    <input type="file" name="file[]" class="file_video" accept="video/*">
    <script>
        $(document).on("change", ".file_video", function (evt) {
            var $source = $('#video_here');
            $source[0].src = URL.createObjectURL(this.files[0]);
            $source.parent()[0].load();
        })
    </script>
</body>

</html>

四、总结

通过以上步骤,我们可以总结如下步骤:

  1. 使用 input 标签进行文件选择
  2. 使用 video标签 配合 input标签 进行视频预览
  3. 使用 captureStream 捕获视频流
  4. 使用 addStream 将视频流发布

原文
https://zhuanlan.zhihu.com/p/291399800

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/4209.html

分享给朋友:

“WebRTC 如何推送本地视频流(webrtc视频流传输)” 的相关文章

nginx实现内外网访问限制

对于特定新版本的上线,有些功能要求能实现内网用户可以访问验证,而外网实际用户使用不受影响,可以在nginx里实现。需求:1、内网访问http://m.xxx.com/movie/list 跳转到指定的链接http://m.xxx.com/newmovie/;2、外网访问不变nginx配置如下:loc...

k8s部署ingress-nginx以及配置http/https访问

ingress概述:Ingress代理并不是pod的service,而是pod,之所以在配置的时候是配置的service,是为了通过service来获取所有pod的信息ingress-nginx组成:1)反向代理负载均衡器:通常以service的port方式运行,接收并按照ingress定义的规则进...

PHP nginx配置 配置nginx支持php

在配置 PHP 和 nginx 以运行 PHP 应用程序时,您需要进行以下步骤:安装 nginx 和 PHP:如果您的系统上尚未安装 nginx 和 PHP,请根据您的操作系统的说明来安装它们。配置 nginx:您需要为 PHP 应用程序创建 nginx 服务器配置。您可以使用以下代码作为模板:ph...

windows 搭建php运行环境(2024年)

由于需要运行一套cms系统,需要运行php环境,现在开始记录搭建步骤:1、分别下载nginx和php包,然后解压到自己喜欢目录下面2、这里我们使用nginx的反向代理模式的FastCGI server,修改nginx.conf,然后启动或重启nginx。location ~ \.php$ {...

linux上将大文件切割成小文件之split命令

说明:很多场景需要拷贝或传输文件时,如果我们需要拷贝的文件太大的话,就需要想办法将其分成小个文件进行拷贝,然后载重新合并。今天介绍 split 命令格式:split [OPTION] [INPUT [PREFIX]]一、压缩并切割使用tar命令进行压缩,使用split进行切割实例:# 压缩 ]# t...

域名备案流程总结

域名备案流程一、前言一般某个网站程序部署到云服务器上后,我们就可以直接通过”服务器主机IP:应用端口”的方式来访问该网站服务了,但这种方式非常不友好。对于广大用户而言,没几个人会记得住那一串IP数字地址。因此我们需要提供一个友好的名称来作为服务器主机IP的别名,让用户在浏览器输入别名就可以访问到网站...