html5图片做背景代码(Html5之webcoekt播放JPEG图片流)
html5图片做背景代码
Html5之webcoekt播放JPEG图片流一、简介
既然webcoekt是基于tcp连接的,理论上讲所有的浏览器是可以私有协议处理二进制的,如果我们需要播放视频,我们可以将视频数据在后端解码后直接将图片推送到webcoekt前端,然后前端通过websocket接收图片然后将图片显示到img或canvas中即可,当然这个是我自己设想的,也是应该可以做的到了,做到如下需要以下技术支持:
- 后端直接ffmpeg转码.jpg" alt="html5图片做背景代码(Html5之webcoekt播放JPEG图片流)" border="0" />
- 后端定制播放协议包括基本指令如play、stop、pause、faster、slower
- 后端需要提供websocket支持发送图片流到前端
- 前端需要接受图片流并显示出来
后端ffmpeg解码这里就不说明了,我有很多库,需要的单独联系我购买,前端的显.jpg" alt="html5图片做背景代码(Html5之webcoekt播放JPEG图片流)" border="0" />
<body>
<img id="player" style="width:704px;height:576px"/>
</body>
二进制通过arraybuffer转base64
function arrayBufferToBase64(buffer) { var binary = ''; var bytes = new Uint8Array(buffer); var len = bytes.byteLength; for (var i = 0; i < len; i++) { binary += String.fromCharCode(bytes[i]); } return window.btoa(binary); }
最后显示:
var player = document.getElementById('player'); var url= arrayBufferToBase64(data); player.src='data:image.jpg" alt="html5图片做背景代码(Html5之webcoekt播放JPEG图片流)" border="0" />
当然,还有其他的方式:
var wsCtrl = new WebSocket("ws://127.0.0.1/ctrl/"); //Establish channel code .... var wsVideo = new WebSocket("ws://127.0.0.1/video/channel1"); wsVideo.onmessage = function(evt) { //Method 1 document.getElementById("img1").src = URL.createObjectURL(evt.data); //Method 2 var read = new FileReader(); read.onload = function(e) { document.getElementById("img2").src = e.target.result; } read.readAsDataURL(evt.data); } ws.onmessage = function(evt) { if(typeof(evt.data)=="string"){ //textHandler(JSON.parse(evt.data)); }else{ var reader = new FileReader(); reader.onload = function(evt){ if(evt.target.readyState == FileReader.DONE){ var url = evt.target.result; alert(url); var img = document.getElementById("imgli"); img.innerHTML = "<img src = "+url+" />"; } } reader.readAsDataURL(evt.data); } };
关于c++的websocket开源工程:websocketpp、QWebSocketServer
二、websocket播放图片流
多说无益,还不如痛痛快快的来一把,为了减低复杂度,我用java的websocket来实现图片流的发送(当然c++的库我也一个实战项目中用过的名为WebSocket的封装的dll工程项目,需要的自行私下购买源码),前端使用一个img标签展示图片,这里说明一下,后台模拟发送图片(这里仅仅是图片,不是流,如果是流直接连续不断发送即可需要ffmpeg转码)
首先前端的代码如下所示:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>websocket显示二进制图片流</title> <style type="text/css"> </style> </head> <script src="jquery.min.js"></script> <script> $(document).ready(function(){ $("#send").click(function(){ //var content = $("#content").val(); $.ajax({ url: "/test/send", data: { //content: content content: "" }, success: function( result ) { console.log("请求成功!"); } }); }); }); </script> <body> <h1>WebSocket播放图片</h1> <img id="player" style="width:500px;height:400px"/><br/> <button id="send">请求图片</button> </body> <script type="application/javascript"> var websocket = { send: function (str) { } }; window.onload = function () { if (!'WebSocket' in window) return; webSocketInit(); }; function webSocketInit() { // 连接到服务端端点 websocket = new WebSocket("ws://127.0.0.1:8080/image/show"); // 成功建立连接 websocket.onopen = function () { console.log("成功连接到服务器"); websocket.send("成功连接到服务器"); }; // 接收到消息 websocket.onmessage = function (event) { // 文本数据包 if(typeof(event.data)=="string"){ // JSON.parse(evt.data) console.log("收到服务端发送的消息:" + event.data); // 图片数据包Blob }else{ var reader = new FileReader(); reader.onload = function(evt){ if(evt.target.readyState == FileReader.DONE){ // base64数据 var url = evt.target.result; document.getElementById("player").src = url; } } reader.readAsDataURL(event.data); } }; // 连接发生错误 websocket.onerror = function () { console.log("WebSocket连接发生错误"); }; // 连接关闭 websocket.onclose = function () { console.log("WebSocket连接关闭"); }; // 监听窗口关闭事件,当窗口关闭时,主动关闭websocket连接 window.onbeforeunload = function () { websocket.close() }; } </script> </html>
每次点击发送的时候就向后台请求一张图,后台将改图发送出去(我简单的使用websocket群发,可以使用websocket的可变参数将websocket和http关联起来,这个应该很容易我这里不再赘述,不了解的进群讨论)
package com.easystudy.controller; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Random; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.easystudy.websocket.ImgEndPoint; /** * @文件名称: TestController.java * @功能描述: 图片流请求请求发送接口(websocket发送图片到web端) * @版权信息: www.easystudy.com * @技术交流: 961179337(QQ群) * @编写作者: lixx2048@163.com * @联系方式: 941415509(QQ) * @开发日期: 2020年9月21日 * @历史版本: V1.0 * @备注信息: */ @RestController @RequestMapping("/test") public class TestController { /** * @功能描述: 发送请求接口 * @版权信息: www.easystudy.com * @编写作者: lixx2048@163.com * @开发日期: 2020年9月21日 * @备注信息: */ @SuppressWarnings("unused") @GetMapping("/send") public String reponseMsgToClient(@RequestParam(name="content", required = true)String content) throws Exception{ System.out.println("开始发送图片数据"); // 随机选择一张图片发送 int index = new Random().nextInt(4) + 1; String imgName = index + ".jpg" alt="html5图片做背景代码(Html5之webcoekt播放JPEG图片流)" border="0" />
我这里多一句嘴,如果是音视频应用的录像播放,这里可以使用websocket传输图片流,然后通过计算发送定点的图片流数据到前端来实现自定义的播放器功能(海康萤石云使用的就是websocket播放录像流的,做法类似)
播放效果如下:
到此这篇关于Html5之webcoekt播.jpg" alt="html5图片做背景代码(Html5之webcoekt播放JPEG图片流)" border="0" />
- html5 web技术(html5视频常用API接口的实战示例)
- html5导航栏跳转(Html5跳转到APP指定页面的实现)
- 如何使用html5的canvas图(html5 canvas实现给图片添加平铺水印)
- HTML5 audio标签
- html5canvas功能介绍(Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 附转换公式)
- h5制作支付功能(基于HTML5+tracking.js实现刷脸支付功能)
- html5如何设置标签(HTML5中在title标题标签里设置小图标的方法)
- 制作共用的头部和底部html5界面(html5移动端价格输入键盘的实现)
- html5复制修改(HTML5实现无刷新修改URL的方法)
- html5的canvas图形绘制技术(详解HTML5 Canvas标签及基本使用)
- html5浏览界面怎么设置(HTML5textarea高度自适应的两种方案)
- html5canvas曲线图例子(html5利用canvas实现颜色容差抠图功能)
- HTML5 播放 RTSP 视频的实例代码(HTML5 播放 RTSP 视频的实例代码)
- vscode快速生成html框架(VSCode 自定义html5模板的实现)
- html5长按动画效果(HTML5自定义元素播放焦点图动画的实现)
- html5 canvas touch(html5 canvas手势解锁源码分享)
- 8月23日11时16分将迎处暑,逐渐进入气象意义上的秋天(8月23日11时16分将迎处暑)
- 花不语 下 如果重来一次的话,你还会这么选择吗(花不语下如果重来一次的话)
- 城市记忆之上海 最难忘的是老弄堂里的市井味道(城市记忆之上海)
- 太鸡贼了,这老小区轻松搞定了停车问题(这老小区轻松搞定了停车问题)
- 太鸡贼了,这老小区轻松搞定了停车问题(这老小区轻松搞定了停车问题)
- 节日我在岗|警景相融 平安相伴(节日我在岗警景相融)
热门推荐
- php开发api接口登录(PHP调用接口API封装的例子)
- python如何解压加密zip文件(python读取有密码的zip压缩文件实例)
- table表格嵌套,边框重叠变粗的解决
- phpstudy中apache到期如何修改(phpStudy找不到Apache“服务名” 解决方法)
- laravelqq邮箱发送失败(解决laravel 表单提交-POST 异常的问题)
- python循环创建字典(Python字典的基本用法实例分析创建、增加、获取、修改、删除)
- centos安装mysql8.0教程(Centos7 安装 Mysql8教程)
- mysql索引基本知识(MySql索引使用策略分析)
- 阿里云服务器可以连接几个面板(阿里云云服务器宝塔面板的安装图文教程详解)
- js中push和join
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9