我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Html5之webcoekt播放JPEG图片流的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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的class="lazy" data-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.class="lazy" data-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").class="lazy" data-src = URL.createObjectURL(evt.data);      //Method 2   var read = new FileReader();   read.onload = function(e)   {      document.getElementById("img2").class="lazy" data-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 class="lazy" data-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 class="lazy" data-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>        <h2>WebSocket播放图片</h2>        <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").class="lazy" data-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;@RestController@RequestMapping("/test")public class TestController {            @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播放录像流的,做法类似)

播放效果如下:

Html5之webcoekt播放JPEG图片流的示例分析

Html5之webcoekt播放JPEG图片流的示例分析

感谢各位的阅读!关于“Html5之webcoekt播放JPEG图片流的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Html5之webcoekt播放JPEG图片流的示例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Html5之webcoekt播放JPEG图片流的示例分析

这篇文章给大家分享的是有关Html5之webcoekt播放JPEG图片流的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、简介既然webcoekt是基于tcp连接的,理论上讲所有的浏览器是可以私有协议处
2023-06-09

Bootstrap中图片轮播的示例分析

小编给大家分享一下Bootstrap中图片轮播的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Bootstrap是什么Bootstrap是目前最受欢迎的前端框架,它是基于 HTML、CSS、JAVASCRIPT 的
2023-06-14

Python图片处理之图片裁剪的示例分析

小编给大家分享一下Python图片处理之图片裁剪的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、操作流程首先会吧?1.有张照片这是网上随便找的一张照片,自行保存测试2.看看照片运行代码,其中show_img函数
2023-06-15

HTML5中Canvas实现图片缩放、翻转、颜色渐变的示例分析

这篇文章将为大家详细讲解有关HTML5中Canvas实现图片缩放、翻转、颜色渐变的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。翻转、移动、平移、放大、缩小XML/HTML Code复制内容到剪贴
2023-06-09

HTML5中picture元素响应式处理图片的示例分析

这篇文章主要介绍了HTML5中picture元素响应式处理图片的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。响应式设计所谓的响应式设计,是指在不同的屏幕分辨率,不同
2023-06-09

HTML5中canvas基本绘图之绘制阴影效果的示例分析

小编给大家分享一下HTML5中canvas基本绘图之绘制阴影效果的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!是HTM
2023-06-09

微信小程序之html5 canvas绘图并保存到系统相册的示例分析

小编给大家分享一下微信小程序之html5 canvas绘图并保存到系统相册的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!开始实现之前先上个效果图 tip
2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录