一、简介
既然webcoekt是基于tc P连 接的,理论上讲所有的浏览器是可以私有协议处理二进制的,如果我们需要播放视频,我们可以将视频数据在 后端 解码后直接将图片推送到webcoekt前端,然后前端通过websocket接收图片然后将图片显示到 img 或canvas中即可,当然这个是我自己设想的,也是 应该 可以做的到了, 做到 如下需要以下技 术 支持:
后端直接ffm PE g 转码 为jpeg图片流 后端定制播放协议包括基本指令如 play 、stop、pause、faster、slower 后端需要提供websocket支持发送图片流到前端 前端需要接受图片流并显示出来后端ffmpeg解码这里就不说明了,我有很多库,需要的单独联系我购买,前端的显示 jpg 流,这里要借助前端显示图片放的做法,使用图片base64数据!前端HT ML 显示二进制jpeg图片:图片流=>二进制转image的base64编码=>设置到img的src中,如前端代码
<body>
<img id=" player " style="width:704px;h ei ght: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. From CharCode(bytes[i]);
}
return window. BT oa(binary);
}
最后显示:
var player = document.getElementById('player');
var url= arrayBufferToBase64(data);
player.src='data:image/jpeg;base64,'+url;
当然,还有其他的方式:
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.t arg et.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.ready stat e == FileReader.DONE){
var url = evt.target.result;
alert(url);
var img = document.getElementById("imgDiv");
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>
< ;m eta charset="UTF-8">
<t IT le>websocket显示二进制图片流</title>
<style type="text/css">
</style>
</head>
<script src=" jq uery.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.ea Sys tudy.controller;
import java.io.File;
import java.io.FileInputStre am ;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Random;
import org .s PR ingframework.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端)
* @版权信息: HdhCmsTesteasystudy .COM
* @技术交流: 961179337( QQ群 )
* @编写作者: lixx2048@163测试数据
* @联系方式: 941415509( QQ )
* @开发日期: 2020年9月21日
* @历史版本: V1.0
* @备注信息:
*/
@RestController
@RequestMapping("/test")
p ub lic class TestController {
/**
* @功能描述: 发送请求接口
* @版权信息: HdhCmsTesteasystudy测试数据
* @编写作者: lixx2048@163测试数据
* @开发日期: 2020年9月21日
* @备注信息:
*/
@Sup Press Warnings("unused")
@GetMapping("/send")
public String repon SEM sgToClient(@RequestParam(name="content", requi red = true)String content) t hr ows Exception{
System.out.println(" 开始 发送图片数据");
// 随机选择一张图片发送
int index = new Random().nextInt(4) + 1;
String imgName = index + ".jpg";
// 判断图片 是否 存在
URL url = getClass().getClassLoader().getResource(imgName);
File file = new File(url.getFile());
if (!file.exists()) {
return "未找到图片!";
}
// 创建输入图片流
InputStream in = new FileInputStream(file);
if (null == in) {
return "打开文件失败!";
}
// 读取图片数据
int size = (int)file.length();
byte[] buffer = new byte[ size];
int count = in.read(buffer, 0, size);
System.out.println("文件长度:" + size + ", 读取长度:" + count);
// 发送图片数据(理论上讲应该只发对端连接的)
ImgEndPoint. fan outMessage(buffer);
// 关闭文件流
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 接口响应
return "消息【" +content+ "】发送成功!";
}
}
我这里多一句嘴,如果是 音视频 应用的录像播放,这里可以使用websocket传输图片流,然后通过计算发送定点的图片流数据到前端来实现自定义的播放器功 能( 海康萤石 云 使用的就是websocket播放录像流的,做法类似)
播放效果如下:
到此这篇关于Html5之webcoekt播放JPEG图片流的 文章 就介绍到这了,更多相关Html5播放JPEG图片流内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!
总结
以上是 为你收集整理的 Html5之webcoekt播放JPEG图片流 全部内容,希望文章能够帮你解决 Html5之webcoekt播放JPEG图片流 所遇到的问题。
如果觉得 网站内容还不错, 推荐好友。
查看更多关于Html5之webcoekt播放JPEG图片流的详细内容...