vue实现网络监控摄像头直播拍照功能

获取摄像机品牌的RTSP地址

比如海康的是: rtsp://user:pwd@ip:port/MPEG-4/ch1/main/av_stream

遗憾的是前端不支持rtsp,但支持rtmp,我们就要想办法将rtsp转为rtmp。网络摄像头想要在前端播放需要启动流媒体服务器推rtmp流。

我这边是请后端开发利用 ffmpeg+nginx 实现的,后端推流实现参考链接:

https://www.e-learn.cn/content/nginx/247481


接下来就等后端的rtmp流媒体服务器成功启动了,rtmp流大概长这样:rtmp://192.168.1.100:3000/mylive/test2sss

前端想要播放rtmp需要依赖插件,目前比较主流和常用的是videojs,但是它无法实现拍照截图功能,无奈只能想办法或者重新找。搜遍全网发现了一个自带拍照截图的插件:EasyPlayer

https://github.com/tsingsee/EasyPlayer.js

其实此作者已经写了api 告诉我们在vue上的用法了。

我按照上面的配置调试了很久始终无法实现直播,一直是黑的,不成功也不报错,一度不知道该怎么排查...... 眼看项目就要上线了,只能想其它办法(有大佬能看懂vue集成配置的欢迎评论指出啊)。

vue实现:

首先下载源码到本地:https://github.com/tsingsee/EasyPlayer.js

我们只需要找到以下三个文件:

注意:EasyPlayer.swf 和 EasyPlayer-element.min.js 两个文件一定要放在同一个目录下!!!不要问我为什么!

 

先将html文件改成这样(另外两个文件不用改):

<!DOCTYPE HTML>
<html>
<head>
    <title>EasyPlayer</title>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="renderer" content="webkit" />
    <meta name="force-rendering" content="webkit" />
    <meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport">
    <style>
        body{
            margin:0
        }
    </style>
</head>
<body>
<!--参数请参考上面github链接中的配置属性-->
<easy-player isresolution="fhd" video-url="你的rtmp流"
             fluent="false"
             auto-play="true"
             live="true"
             stretch="true">
</easy-player>
</body>
<script type="text/javascript" src="./EasyPlayer-element.min.js"></script>
</html>

将这三个文件放在vue里的static目录中:

最后在项目中需要用到的vue文件中使用 iframe 标签引入:

<iframe name="video_frame" id="video" src="/static/EasyPlayer/index.html" width="1663" height="930" frameborder="0" scrolling="no"></iframe>

运行项目:

拍照功能(不需要拍照功能可以直接跳过):

视频中自带这个功能,鼠标移入监控视图下方找到一个相机小图标,会直接将图片下载到本地,但我们的需求是外接拍照按钮。这么一来就需要改源码:

打开 EasyPlayer-element.min.js 文件,刚打开应该是压缩的,网上找个工具先格式化代码

然后 ctrl+f 找到这行代码:

d.toDataURL("image/" + u)

或者直接格式化后找到第50027行附近,找到了之后在这里插入两行代码:

 最后在拍照按钮的点击事件添加如下代码:

// 点击拍照
btn_camera(){
    var self = this;
    const childWindow = document.getElementById('video').contentWindow;
    const btn = childWindow.document.querySelector('button[title="快照"]');
    btn.click();
    setTimeout(function () {
        self.base64 = childWindow.window.l;// 获取到的base64截图数据
    },500);
},

 

demo版:

本地运行需要使用 apache 本地服务器(下载地址):http://www.wampserver.com/,安装好并可以用的的apache长这样 

这三个文件直接放在apache中的www目录下:

修改html文件:

<!DOCTYPE HTML>
<html>
<head>
    <title>EasyPlayer</title>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="renderer" content="webkit" />
    <meta name="force-rendering" content="webkit" />
    <meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport">
    <style>
        body{
            margin:0
        }
    </style>
</head>
<body>
<!--参数请参考上面github链接中的配置属性-->
<easy-player isresolution="fhd" video-url="你的rtmp流"
             fluent="false"
             auto-play="true"
             live="true"
             stretch="true">
</easy-player>
</body>
<script type="text/javascript" src="./EasyPlayer-element.min.js"></script>
</html>

浏览器直接访问:http://localhost/   可以直接看到demo效果,如果不行的话,可以百度开一下apache服务器的跨域。

完。

各位看官有问题可以评论区或发邮件一起探讨,个人邮箱:dingjie0730mi@163.com

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue中调用摄像头拍照功能可以使用`getUserMedia` API和`<video>`元素来实现。下面是一个简单的示例: 首先,你需要在Vue组件中创建一个`<video>`元素来显示摄像头捕获的视频流: ```vue <template> <div> <video ref="videoElement"></video> <button @click="capturePhoto">拍照</button> </div> </template> <script> export default { mounted() { this.initCamera(); }, methods: { async initCamera() { try { const stream = await navigator.mediaDevices.getUserMedia({ video: true }); this.$refs.videoElement.srcObject = stream; } catch (error) { console.error("无法访问摄像头:", error); } }, capturePhoto() { const videoElement = this.$refs.videoElement; const canvas = document.createElement("canvas"); canvas.width = videoElement.videoWidth; canvas.height = videoElement.videoHeight; canvas.getContext("2d").drawImage(videoElement, 0, 0); // 将图像数据转为Base64编码的字符串 const photoDataUrl = canvas.toDataURL("image/png"); // 在这里你可以对照片数据进行处理或者发送到服务器 console.log(photoDataUrl); }, }, }; </script> ``` 上述代码中,`getUserMedia` API用于获取摄像头的视频流,并通过`srcObject`将视频流赋值给`<video>`元素的属性,从而实现在网页中显示摄像头捕获的图像。 当用户点击"拍照"按钮时,`capturePhoto`方法会将视频帧绘制到一个`<canvas>`元素上,并将图像数据转为Base64编码的字符串,你可以在此处对照片数据进行处理或者发送到服务器。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值