欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Html5之webcoekt播放JPEG圖片流

  發(fā)布時間:2020-09-22 16:36:46   作者:貝殼里的沙   我要評論
這篇文章主要介紹了Html5之webcoekt播放JPEG圖片流,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、簡介

既然webcoekt是基于tcp連接的,理論上講所有的瀏覽器是可以私有協(xié)議處理二進制的,如果我們需要播放視頻,我們可以將視頻數(shù)據(jù)在后端解碼后直接將圖片推送到webcoekt前端,然后前端通過websocket接收圖片然后將圖片顯示到img或canvas中即可,當然這個是我自己設想的,也是應該可以做的到了,做到如下需要以下技術支持:

  • 后端直接ffmpeg轉(zhuǎn)碼為jpeg圖片流
  • 后端定制播放協(xié)議包括基本指令如play、stop、pause、faster、slower
  • 后端需要提供websocket支持發(fā)送圖片流到前端
  • 前端需要接受圖片流并顯示出來

后端ffmpeg解碼這里就不說明了,我有很多庫,需要的單獨聯(lián)系我購買,前端的顯示jpg流,這里要借助前端顯示圖片放的做法,使用圖片base64數(shù)據(jù)!前端HTML顯示二進制jpeg圖片:圖片流=>二進制轉(zhuǎn)image的base64編碼=>設置到img的src中,如前端代碼

<body>
    <img id="player" style="width:704px;height:576px"/>
</body>

二進制通過arraybuffer轉(zhuǎn)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來實現(xiàn)圖片流的發(fā)送(當然c++的庫我也一個實戰(zhàn)項目中用過的名為WebSocket的封裝的dll工程項目,需要的自行私下購買源碼),前端使用一個img標簽展示圖片,這里說明一下,后臺模擬發(fā)送圖片(這里僅僅是圖片,不是流,如果是流直接連續(xù)不斷發(fā)送即可需要ffmpeg轉(zhuǎn)碼)

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

<!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) {
                // 文本數(shù)據(jù)包
                if(typeof(event.data)=="string"){
                    // JSON.parse(evt.data)
                    console.log("收到服務端發(fā)送的消息:" + event.data);
                // 圖片數(shù)據(jù)包Blob
                }else{
                    var reader = new FileReader();
                    reader.onload = function(evt){
                        if(evt.target.readyState == FileReader.DONE){
                            // base64數(shù)據(jù)
                            var url = evt.target.result;
                            document.getElementById("player").src = url;
                        }
                    }
                    reader.readAsDataURL(event.data);
                }
            };
            // 連接發(fā)生錯誤
            websocket.onerror = function () {
                console.log("WebSocket連接發(fā)生錯誤");
            };
            // 連接關閉
            websocket.onclose = function () {
                console.log("WebSocket連接關閉");
            };
            // 監(jiān)聽窗口關閉事件,當窗口關閉時,主動關閉websocket連接
            window.onbeforeunload = function () {
                websocket.close()
            };
        }
    </script>
</html>

每次點擊發(fā)送的時候就向后臺請求一張圖,后臺將改圖發(fā)送出去(我簡單的使用websocket群發(fā),可以使用websocket的可變參數(shù)將websocket和http關聯(lián)起來,這個應該很容易我這里不再贅述,不了解的進群討論)

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
 * @功能描述: 圖片流請求請求發(fā)送接口(websocket發(fā)送圖片到web端)
 * @版權信息:  www.easystudy.com
 * @技術交流:  961179337(QQ群)
 * @編寫作者:  lixx2048@163.com
 * @聯(lián)系方式:  941415509(QQ)
 * @開發(fā)日期:  2020年9月21日
 * @歷史版本: V1.0 
 * @備注信息:
 */
@RestController
@RequestMapping("/test")
public class TestController {
    
    /**
     * @功能描述: 發(fā)送請求接口
     * @版權信息:  www.easystudy.com
     * @編寫作者:  lixx2048@163.com
     * @開發(fā)日期:  2020年9月21日
     * @備注信息:
     */
    @SuppressWarnings("unused")
    @GetMapping("/send")
    public String reponseMsgToClient(@RequestParam(name="content", required = true)String content) throws Exception{
        System.out.println("開始發(fā)送圖片數(shù)據(jù)");
        
        // 隨機選擇一張圖片發(fā)送
        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 "未找到圖片!";
        }
        
        // 創(chuàng)建輸入圖片流
        InputStream in = new FileInputStream(file);
        if (null == in) {
            return "打開文件失敗!";
        }
        
        // 讀取圖片數(shù)據(jù)
        int size = (int)file.length();
        byte[] buffer = new byte[ size];
        int count = in.read(buffer, 0, size);    
        System.out.println("文件長度:" + size + ", 讀取長度:" + count);
        
        // 發(fā)送圖片數(shù)據(jù)(理論上講應該只發(fā)對端連接的)
        ImgEndPoint.fanoutMessage(buffer);
        
        // 關閉文件流
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // 接口響應
        return "消息【" +content+ "】發(fā)送成功!";
    }
}

我這里多一句嘴,如果是音視頻應用的錄像播放,這里可以使用websocket傳輸圖片流,然后通過計算發(fā)送定點的圖片流數(shù)據(jù)到前端來實現(xiàn)自定義的播放器功能(??滴炇剖褂玫木褪莣ebsocket播放錄像流的,做法類似)

播放效果如下:

到此這篇關于Html5之webcoekt播放JPEG圖片流的文章就介紹到這了,更多相關Html5播放JPEG圖片流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持腳本之家!

相關文章

  • HTML5播放實現(xiàn)rtmp流直播

    這篇文章主要介紹了HTML5播放實現(xiàn)rtmp流直播,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-16
  • html5用video標簽流式加載的實現(xiàn)

    這篇文章主要介紹了html5用video標簽流式加載的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習
    2020-05-20
  • 基于 HTML5 WebGL 實現(xiàn)的醫(yī)療物流系統(tǒng)

    物聯(lián)網(wǎng)( IoT ),簡單的理解就是物體之間通過互聯(lián)網(wǎng)進行鏈接。這篇文章給大家介紹基于 HTML5 WebGL 實現(xiàn)的醫(yī)療物流系統(tǒng),感興趣的朋友跟隨小編一起看看吧
    2019-10-08
  • Html5 實現(xiàn)微信分享及自定義內(nèi)容的流程

    這篇文章主要介紹了Html5 實現(xiàn)微信分享及自定義內(nèi)容的流程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-20
  • HTML5 canvas 瀑布流文字效果的示例代碼

    這篇文章主要介紹了HTML5 canvas 瀑布流文字效果的示例代碼的相關資料,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-31
  • HTML5移動端手機網(wǎng)站開發(fā)流程

    這篇文章主要為大家介紹了HTML5移動端手機網(wǎng)站開發(fā)流程,想要進行移動端手機網(wǎng)站開發(fā)的朋友可以參考一下
    2016-04-25
  • HTML5實現(xiàn)的圖片無限加載的瀑布流效果另帶邊框圓角陰影

    一款網(wǎng)頁瀑布流效果,可以實現(xiàn)圖片的無限制加載?;跁r下流行的HTML5技術編寫而成,除了實現(xiàn)瀑布流,還加入了CSS5的圖片修飾效果,比如圖片的圓角邊框、圖片陰影立體效果
    2014-03-07
  • HTML5夢幻之旅——炫麗的流星雨效果實現(xiàn)過程

    流星出現(xiàn)的時候,人們都喜歡對著它們許愿,因為傳說對著流星許下愿望后,愿望就能實現(xiàn),最近出于興趣,制作一個拖尾效果,后來想到可以通過拖尾效果來實現(xiàn)一下流星雨的效果
    2013-08-06
  • HTML5 離線應用之打造零請求、無流量網(wǎng)站的解決方法

    今天Web應用程序已經(jīng)很復雜了,以現(xiàn)在的發(fā)展,會將越來越復雜,但他有一個致命缺點,不能脫離internet鏈接,因此在HTML中新增了一API,它使用一個本地存儲機制很好地解決了
    2013-04-25

最新評論