Html5之webcoekt播放-虚拟主机系统-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中,如前端代码

二进制经过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 = ““;
}
}
reader.readAsDataURL(evt.data);
}
};

关于c++的websocket开源工程:websocketpp、QWebSocketServer

二、websocket播映图片流

多说无益,还不如痛痛快快的来一把,为了减低复杂度,我用java的websocket来完成图片流的发送(当然c++的库我也一个实战项目中用过的名为WebSocket的封装的dll工程项目,需求的自行私下购买源码),前端运用一个img标签展示图片,这儿说明一下,后台模仿发送图片(这儿仅仅是图片,不是流,如果是流直接接二连三发送即可需求ffmpeg转码)

首先前端的代码如下所示:

websocket显现二进制图片流

WebSocket播映图片

恳求图片

 

每次点击发送的时候就向后台恳求一张图,后台将改图发送出去(我简单的运用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端)
* @版权信息: http://www.easystudy.com
* @技术交流: 961179337(QQ群)
* @编写作者: lixx2048@163.com
* @联系方式: 941415509(QQ)
* @开发日期: 2020年9月21日
* @前史版别: V1.0
* @补白信息:
*/
@RestController
@RequestMapping(“/test”)
public class TestController {
/**
* @功用描述: 发送恳求接口
* @版权信息: http://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”;
// 判断图片是否存在
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.fanoutMessage(buffer);
// 封闭文件流
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 接口响应
return “音讯【” +content+ “】发送成功!”;
}
}

我这儿多一句嘴,如果是音视频运用的录像播映,这儿能够运用websocket传输图片流,然后经过计算发送定点的图片流数据到前端来完成自定义的播映器功用(海康萤石云运用的便是websocket播映录像流的,做法相似)

播映效果如下:

共有 0 条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注