互联网技术 · 2024年2月26日

使用HTML5的WebSockets播放JPEG图像流

这篇文章主要介绍了Html5之webcoekt播放JPEG图片流,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、简介

既然webcoekt是基于tcp连接的,理论上讲所有的浏览器是可以私有协议处理二进制的,如果我们需要播放视频,我们可以将视频数据在后端解码后直接将图片推送到webcoekt前端,然后前端通过websocket接收图片然后将图片显示到img或canvas中即可,当然这个是我自己设想的,也是应该可以做的到了,做到如下需要以下技术支持:

后端直接ffmpeg转码为jpeg图片流

后端定制播放协议包括基本指令如play、stop、pause、faster、slower

后端需要提供websocket支持发送图片流到前端

前端需要接受图片流并显示出来

后端ffmpeg解码这里就不说明了,我有很多库,需要的单独联系我购买,前端的显示jpg流,这里要借助前端显示图片放的做法,使用图片base64数据!前端HTML显示二进制jpeg图片:图片流=>二进制转image的base64编码=>设置到img的src中,如前端代码

<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/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.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(“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>
<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关联起来,这个应该很容易我这里不再赘述,不了解的进群讨论)

播放效果如下:

Html5之webcoekt播放JPEG图片流 -

到此这篇关于Html5之webcoekt播放JPEG图片流的文章就介绍到这了,更多相关Html5播放JPEG图片流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.