js 利用canvas + flv.js实现视频流 截屏 、本地下载功能实现,兼容火狐,谷歌;canvas截屏跨域问题,无音频视频流加载不显示问题
项目:物联网监控项目----后台视频流管理(前端实现视频截屏功能)
本文就不同视频源分情况展示:
1 本地视频(项目同目录视频)截屏(canvas.getContext("2d).drawImage())
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
<style type="text/css">
.screen_shot_btn,.screen_save_btn{display: inline-block;width: 72px;height: 36px;text-align: center;line-height: 36px;text-decoration: none;background: #4473C2;border: none;border-radius: 8px;margin:0 5px;color:#fff;outline: none;}
.btn-wrap{margin:15px 0;}
.img_show_wrap{width: 720px;height: 450px;margin:15px 0;position:relative;}
#image_el,#V2I_canvas{position:absolute;width: 720px;height: 450px;top:0;left:0;}
</style>
</head>
<body>
<div class="btn-wrap">
<a id="screen_shot_btn" class="screen_shot_btn" href="javascript:">截图</a>
<a id="screen_save_btn" class="screen_save_btn" href="javascript:">下载</a>
</div>
<div class="video_wrap">
<video id="video_el" autoplay width="720" height="450"><source src="data:images/sp.mp4" /></video>
</div> <div class="img_show_wrap">
<canvas width="720" height="450" id="V2I_canvas" ></canvas>
<img id="image_el" src="" alt="">
</div>
<script src="js/jquery-1.11.3.min.js" type="text/javascript"></script>
<script type="text/javascript" src="js/flv.js"></script>
<script type="text/javascript">
$(function() {
var mySrc = ""; function htmlToImage() {
var canvas = document.getElementById("V2I_canvas");
if (!canvas.getContext) {
alert("您的浏览器暂不支持canvas");
return false;
} else {
var context = canvas.getContext("2d");
var video = document.getElementById("video_el");
context.drawImage(video, 0, 0, canvas.width, canvas.height);
return mySrc = canvas.toDataURL("image/png");
}
}
$("#screen_shot_btn").click(function(event) {
htmlToImage();
$("#image_el").attr("src", mySrc);
}); $("#screen_save_btn").click(function() {
htmlToImage();
if ($("#image_el").attr("src") != "") {
downloadFile(mySrc);
} else {
alert("内容为空");
}
}) function downloadFile(src) {
var triggerDownload = $("#screen_save_btn").attr("href", src).attr("download", "jietu.png"); }
})
</script>
</body>
</html>
2跨域视频截屏
note: 在video 标签内 添加 crossorigin="*" 即可
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
<style type="text/css">
.screen_shot_btn,.screen_save_btn{display: inline-block;width: 72px;height: 36px;text-align: center;line-height: 36px;text-decoration: none;background: #4473C2;border: none;border-radius: 8px;margin:0 5px;color:#fff;outline: none;}
.btn-wrap{margin:15px 0;}
.img_show_wrap{width: 720px;height: 450px;margin:15px 0;position:relative;}
#image_el,#V2I_canvas{position:absolute;width: 720px;height: 450px;top:0;left:0;}
</style>
</head>
<body>
<div class="btn-wrap">
<a id="screen_shot_btn" class="screen_shot_btn" href="javascript:">截图</a>
<a id="screen_save_btn" class="screen_save_btn" href="javascript:">下载</a>
</div>
<div class="video_wrap">
<video id="video_el" crossorigin="*" autoplay width="720" height="450"><source src="http://jq22com.qiniudn.com/jq22-sp.mp4" /></video>
</div> <div class="img_show_wrap">
<canvas width="720" height="450" id="V2I_canvas" ></canvas>
<img id="image_el" src="" alt="">
</div>
<script src="js/jquery-1.11.3.min.js" type="text/javascript"></script>
<script type="text/javascript" src="js/flv.js"></script>
<script type="text/javascript">
$(function() {
var mySrc = ""; function htmlToImage() {
var canvas = document.getElementById("V2I_canvas");
if (!canvas.getContext) {
alert("您的浏览器暂不支持canvas");
return false;
} else {
var context = canvas.getContext("2d");
var video = document.getElementById("video_el");
context.drawImage(video, 0, 0, canvas.width, canvas.height);
return mySrc = canvas.toDataURL("image/png");
}
}
$("#screen_shot_btn").click(function(event) {
htmlToImage();
$("#image_el").attr("src", mySrc);
}); $("#screen_save_btn").click(function() {
htmlToImage();
if ($("#image_el").attr("src") != "") {
downloadFile(mySrc);
} else {
alert("内容为空");
}
}) function downloadFile(src) {
var triggerDownload = $("#screen_save_btn").attr("href", src).attr("download", "jietu.png"); }
})
</script>
</body>
</html>
3 flv.js 实现 视频流截屏
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
<style type="text/css">
.screen_shot_btn,.screen_save_btn{display: inline-block;width: 72px;height: 36px;text-align: center;line-height: 36px;text-decoration: none;background: #4473C2;border: none;border-radius: 8px;margin:0 5px;color:#fff;outline: none;}
.btn-wrap{margin:15px 0;}
.img_show_wrap{width: 720px;height: 450px;margin:15px 0;position:relative;}
#image_el,#V2I_canvas{position:absolute;width: 720px;height: 450px;top:0;left:0;}
</style>
</head>
<body>
<div class="btn-wrap">
<a id="screen_shot_btn" class="screen_shot_btn" href="javascript:">截图</a>
<a id="screen_save_btn" class="screen_save_btn" href="javascript:">下载</a>
</div>
<div class="video_wrap">
<video id="video_el" crossorigin="*" width="720" height="450"></video>
</div> <div class="img_show_wrap">
<canvas width="720" height="450" id="V2I_canvas" ></canvas>
<img id="image_el" src="" alt="">
</div>
<script src="js/jquery-1.11.3.min.js" type="text/javascript"></script>
<script type="text/javascript" src="js/flv.js"></script>
<script type="text/javascript">
$(function() { if (flvjs.isSupported()) {
var videoElement = document.getElementById('video_el');
var flvPlayer = flvjs.createPlayer({
type: 'flv',
url: 'http://192.168.30.218:8100/movie1'
});
flvPlayer.attachMediaElement(video_el);
flvPlayer.load();
flvPlayer.play();
}
var mySrc = ""; function htmlToImage() {
var canvas = document.getElementById("V2I_canvas");
if (!canvas.getContext) {
alert("您的浏览器暂不支持canvas");
return false;
} else {
var context = canvas.getContext("2d");
var video = document.getElementById("video_el");
context.drawImage(video, 0, 0, canvas.width, canvas.height);
return mySrc = canvas.toDataURL("image/png");
}
}
$("#screen_shot_btn").click(function(event) {
htmlToImage();
$("#image_el").attr("src", mySrc);
}); $("#screen_save_btn").click(function() {
htmlToImage();
if ($("#image_el").attr("src") != "") {
downloadFile(mySrc);
} else {
alert("内容为空");
}
}) function downloadFile(src) {
var triggerDownload = $("#screen_save_btn").attr("href", src).attr("download", "jietu.png"); }
})
</script>
</body>
</html>
总结:
1、 context.drawImage(image, 0, 0, canvas.width, canvas.height);
此处的 context.drawImage 的方法 video 应该为 image绘制到上下文的元素。允许任何的 canvas 图像源(CanvasImageSource),例如:HTMLImageElement,HTMLVideoElement,或者 HTMLCanvasElement。
传送门:CanvasRenderingContext2D.drawImage() 。
note: 因此 视频流截屏时不能用 video.js ,因为video.js 本质是用的flash ,把video标签处理了.
2、出现跨域 不能用canvas.toDataURL()
解决办法:1、把视频资源放入目录中
2,或者在 视频标签中添加 crossorigin="*"
3、 flv.js兼容性不大好,目前只测兼容pc 端火狐,谷歌;移动端不支持。下载的 download 属性兼容性 也不乐观,后续找到解决方案再补上。
4、 视频流如果无音频 可在属性里添加 hasAudio:false
无音频的话会出现,视频流加载进来但是无法播放的问题,控制台也不报错
-------------------------完-------------------------
---------------------(题外话)下载方法补充:-------------------------
借助 bolb download下载文件方法 替换上述 downloadFile方法(转自 by zhangxinxu from http://www.zhangxinxu.com/wordpress/?p=6252):
图片下载方法:
var funDownload = function(domImg, filename) {
// 创建隐藏的可下载链接
var eleLink = document.createElement('a');
eleLink.download = filename;
eleLink.style.display = 'none';
// 图片转base64地址
var canvas = document.createElement('canvas');
var width = domImg.naturalWidth;
var height = domImg.naturalHeight;
canvas.width = width;
canvas.height = height;
var context = canvas.getContext('2d');
console.log(`${width}+${height}`);
context.drawImage(domImg, 0, 0,width,height);
// 如果是PNG图片,则context.toDataURL('image/png')
eleLink.href = canvas.toDataURL('image/png');
// 触发点击
document.body.appendChild(eleLink);
eleLink.click();
// 然后移除
document.body.removeChild(eleLink);
};
-----------------------------------------------------------
文本类 文件下载:
var fileDownload = function (content, filename) {
// 创建隐藏的可下载链接
var elLink = document.createElement('a');
elLink.download = filename;
elLink.style.display = 'none';
// 字符内容转变成blob地址
var blob = new Blob([content]);
elLink.href = URL.createObjectURL(blob);
// 触发点击
document.body.appendChild(elLink);
elLink.click();
// 然后移除
document.body.removeChild(elLink);
};
----------------------------------------
js 利用canvas + flv.js实现视频流 截屏 、本地下载功能实现,兼容火狐,谷歌;canvas截屏跨域问题,无音频视频流加载不显示问题的更多相关文章
- js图片未加载完显示loading效果
<html> <title>js图片未加载完显示loading效果</title> <body> <style> img{float:lef ...
- js 利用jquery.gridly.js实现拖拽并且排序
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JS图片加载失败显示默认图片
代码如下: <div id='photo<%# Container.DataItemIndex+1%>' style="position: absolute; displa ...
- js解决img标签加载失败显示默认图片
问题: 为所有显示楼盘的页面添加一个加载失败的默认图片. 基本思路: img标签中有个onerror属性,专门用来处理加载失败的事件.所以可以用jquery添加onerror属性,在onerror中加 ...
- 利用Django REST framework快速实现文件上传下载功能
安装包 pip install Pillow 设置 首先在settings.py中定义MEDIA_ROOT与MEDIA_URL.例如: MEDIA_ROOT = os.path.join(BASE_D ...
- js的跨域问题和解决办法
我们在开发中,经常会遇到跨域请求数据问题,那么什么是跨域呢?跨域就是js在不用域之间的数据传输或者通信,比如你在使用ajax从另外一个域请求数据,或者你的页面引入了iframe,要从iframe中获取 ...
- 初步了解关于js跨域问题
js跨域问题是指在js在不同的域中进行数据传输或者数据通信,比如通过ajax向不同的域请求数据(说到ajax,不可避免的就会遇到两个问题:一是ajax是如何传递数据的?二是ajax是如何实现跨域的?) ...
- 初步了解关于js跨域问题-jsonp
js跨域问题是指在js在不同的域中进行数据传输或者数据通信,比如通过ajax向不同的域请求数据(说到ajax,不可避免的就会遇到两个问题:一是ajax是如何传递数据的?二是ajax是如何实现跨域的?) ...
- js便签笔记(8)——js加载XML字符串或文件
1. 加载XML文件 方法1:ajax方式.代码如下: var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObje ...
随机推荐
- react 生命周期函数介绍
constructor():构造函数 执行:组件加载钱最先调用一次,仅调用一次. 作用:定义状态机变量. 注意:第一个语句必须为super(), 否则会报错:'this' is not allowed ...
- UOJ 7 NOI2014 购票
题意:给一棵树计算一下各个点在距离限制下以一定的费用公式通过不停地到祖先最后到达一号点的最小花费. 第一种做法:线段树维护带修凸壳.显然的,这个公式计算是p*x+q 所以肯定和斜率有关系.然后这题的d ...
- 【学习笔记】python
1. len( s ) 返回对象(字符.列表.元祖等)的长度或项目个数. >>>str = "runoob" >>> len(str) # ...
- 一道简单的CTF登录题题解
一.解题感受 这道题50分,在实验吧练习场算比较高分,而且通过率只有14%,比较低的水平. 看到这两个数据,一开始就心生惬意,实在不应该呀! 也是因为心态原因,在发现test.php之后,自以为在SQ ...
- redis connection refused: connect 启动失败
先到redis解压包下执行 ./redis-server redis.conf 再连接 redis-cli
- 关联分析Apriori算法和FP-growth算法初探
1. 关联分析是什么? Apriori和FP-growth算法是一种关联算法,属于无监督算法的一种,它们可以自动从数据中挖掘出潜在的关联关系.例如经典的啤酒与尿布的故事.下面我们用一个例子来切入本文对 ...
- 《Java》第八周学习总结
第八周学习内容:课本第15章节的内容泛型与集合框架 主要内容有 -泛型-链表-堆栈-散列映射-树集-树映射 重点和难点-重点:泛型和集合的使用码云:https://gitee.com/ShengHu ...
- 基于jeesite的cms系统(六):Lucene全文搜索引擎
1.lucene初始化 // @Value("${lucene.index.path}") private String indexPath = "/Users/vito ...
- [Luogu P1119]灾后重建
这是一道考Floyd本质的题. 回忆一下Floyd的原理,三层循环,最外层循环枚举的是中转点,也就是用两点到中转点距离之和来更新最短路.然后来看下题目,重建时间是按照从小到大排序的,也就是说,当第i个 ...
- 技术栈(technology stack)
technology stack 技术栈: 产品实现上依赖的软件基础组件, 包括 1. 系统 2. 中间件 3. 数据库 4. 应用软件 5. 开发语言 6. 框架 https://en.wikipe ...