当前位置: 代码网 > it编程>网页制作>html5 > Html5之webcoekt播放JPEG图片流

Html5之webcoekt播放JPEG图片流

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

一、简介

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

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";
        
        // 判断图片是否存在
        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播放jpeg图片流内容请搜索代码网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持代码网!

(0)

相关文章:

  • 利用Node实现HTML5离线存储的方法

    利用Node实现HTML5离线存储的方法这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友…

    2020年10月16日 网页制作
  • 浅析HTML5 Landmark

    浅析HTML5 Landmark这篇文章主要介绍了HTML5 Landmark的相关资料,帮助大家了解和学习Landmark,感兴趣的朋友可以了解下... 20-09-11 …

    2020年09月11日 网页制作
  • 使用HTML5做的导航条详细步骤

    使用HTML5做的导航条详细步骤这篇文章主要介绍了用HTML5做的导航条详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... …

    2020年10月19日 网页制作
  • 详解HTML5中CSS外观属性

    详解HTML5中CSS外观属性这篇文章主要介绍了HTML5中CSS外观属性的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,,需要的朋友可以参考下.…

    2020年09月10日 网页制作
  • app内嵌H5 webview 本地缓存问题的解决

    app内嵌H5 webview 本地缓存问题的解决

    app内嵌H5 webview 本地缓存问题的解决这篇文章主要介绍了app内嵌H5 webview 本地缓存问题的解决,文中通过示例代码介绍的非常详细,对大家... [阅读全文]
  • 详解如何在登录过期后跳出Ifram框架

    详解如何在登录过期后跳出Ifram框架

    详解如何在登录过期后跳出Ifram框架这篇文章主要介绍了详解如何在登录过期后跳出Ifram框架,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com