亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费

新聞中心

NEWS

當前位置: 首頁(yè) > APP開(kāi)發(fā)

Html5之webcoekt播放JPEG圖片流

時(shí)間:2026-05-04 23:13:34

這篇文章主要介紹了Html5之webcoekt播放JPEG圖片流,片流文中通過(guò)示例代碼介紹的非常詳細,對大家的片流學(xué)習或者工作具有一定的參考學(xué)習價(jià)值,需要的片流朋友們下面隨著(zhù)小編來(lái)一起學(xué)習學(xué)習吧

一、簡(jiǎn)介

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

后端直接ffmpeg轉碼為jpeg圖片流

后端定制播放協(xié)議包括基本指令如play、片流stop、片流pause、片流faster、片流slower

后端需要提供websock(O_O)et支持發(fā)送圖片流到前端

前端需要接受圖片流并顯示出來(lái)

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

<body>
<img id='(′ω`*)player' style='width:704px;height:576px'/>
</body>

二進(jìn)制通過(guò)arraybu( ?ヮ?)ffer轉base64

function arrayB??ufferToBase64(bu??ffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = byte(′_`)s.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}

最后顯示:

var playe??r = document.getElementById('player');
var url= arrayBufferToBase64(data);
player.src='data:image/jpeg;base64,'+url;

當然,還有其他的方式:

var wsCtrl = new Web(′?ω?`)Socket("ws://127.0.0.1/ctrl/");
//Establish channel code
....
var wsVideo?? = new WebSocket("ws://127.0.0.1/video/channel1");
wsVideo.onmessage = functio??n(evt)
{
//Method 1
document.getEle(?Д?)mentById(??"img1").src = URL.createObjectURL(evt.data);

//Meth(╬?益?)od 2
var read(′_ゝ`) = new FileReader();
read.onload(╬?益?) = function(e)
{
document.getElementById("img2").src = e.target.??result;
}
read.readAsDaヽ(′▽?zhuān)?ノtaURL(evt.d??ata);
}

ws.onmes(°ロ°) !sage = function(evt) {
if(typeof(evt.data)=="strin(′▽?zhuān)?g"){
//textHandler(JSON??.parse(evt.data));
}else{
var reader = new FileReader();
reader.onloa(╬?益?)d = function(evt){
if(evt.target.readyState == FileReader.DONE){
var url = evt.target.result;
alert(url);
var img = document.getElementById("imgDiv");
img.in??nerHTˉ\_(ツ)_/ˉML='<img sr??c = '+url+" /&g(╬ ò﹏ó)t;";
}
}
reader.readAsDataURL(evt.data);
}
};

關(guān)于c++的websocket開(kāi)源工程:websocketpp、QWebSocketServer

二、websocket播放圖片流??

多說(shuō)無(wú)益,還不如痛痛快快的來(lái)一把,為了減低復雜度,我用java的websocket來(lái)實(shí)現圖片流的發(fā)送(當然c++的庫我也一個(gè)實(shí)戰(′?ω?`)項目中用過(guò)的名為WebSocket的封裝的dll工程項目,需要的自行私下購買(mǎi)源碼),前端使用一個(gè)img標簽展示圖片,這里說(shuō)明一下,后臺模擬發(fā)送圖片(這里僅僅是圖片,不是流,如果是流直接連續不斷發(fā)送即可(ke)需要ffmpeg轉碼)

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

<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset="U(//ω//)TF-8">
<title>websocket顯示二進(jìn)制圖片流</title>
&l??t;style type="text/css">
</??style>
</head>
<┐(′?`)┌script src='jquery.min.js'></script>
<(′▽?zhuān)?);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>WebSockヽ(′ー`)ノet播放圖片</h1>
<img id="player" style='width:500px;height:400px'/><br/>
<button id=(⊙_⊙)"send">請求圖片&l??t;/button>
</bo(′?ω?`)dy>
<script type='application/javascript'>
var websocket = {
send: function (str) {
}
};
window.onload = function () {
if (!'WebSocket' in window) return;
webSocketInit();
};
function webSocketInit() {
// 連接到服務(wù)端端點(diǎn)
websocket = new WebSocket("w??s://127.0.0.1:8080/image/show"??);
// 成功建立連接
websock??et.onopen = function?? () {
console.log("成功連接到服務(wù)器");
websocket.send("成功連接到服務(wù)器(???)");
};
// 接收到消息
websocket.onmessage(′▽?zhuān)? = function (event) {
// 文本數據包
if(type??of(event.data)=="string"){
// JSON.parse(evt.data)
console.log("收到服務(wù)端發(fā)送的消息:" + event.data);
// 圖片數據包Blob
}else{
var reader = new FileReader(ヾ(′?`)?);
reader.o(?_?;)nload = function(evt){
if(evt.target.readyState == FileReader.DONE){
// base64數據
var?? url = evt.target.result;
document.getElemeヾ(′?`)?ntById("player").src = url;
}
}
reader.readAs??DataURL(event.data);
}
};
// 連接(//ω//)發(fā)生錯誤
websocket.onerror = function () {
console.l(′▽?zhuān)?)og("WebSocket連接發(fā)生錯誤");
};
// 連接關(guān)(guan)閉
websocket.onclose = function () {
console.log("WebSocket連接關(guān)閉");
};
// 監聽(tīng)窗口關(guān)閉事件,當窗口關(guān)閉時(shí),主??動(dòng)關(guān)閉websocket連接??
window.onbeforeunload = function () {
websocket.close()
};
}
</script>
</html&g??t;

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

package co??m.easystudy.controller;

import java.io.File;
import java.io.FileInputStream;
import java.??io.IOException;ヽ(′ー`)ノ
import java.io.InputStream;
import ja??va.net.URL;
import?? java.util.Random;

impoヽ(′ー`)ノrt org.springframework.web.bind.annotation.GetMapping;
import orgヾ(′?`)?.springframework.web.bind.annotation.RequestMapping;
impo(′?`)rt org.springframework.web.biヽ(′ー`)ノnd.annotation.RequestParam;
import org.springframework.web.bind.annot(╯°□°)╯︵ ┻━┻ation.RestController;

import com.ヾ(′?`)?easystudy.websocket.ImgEndPoint;

/**
* @文件名??稱(chēng): TestCont??rol??ler.java
* @功能描述: 圖片流請求請求┐(′ー`)┌發(fā)(fa)送接口(websocket發(fā)送圖片到web端)
* @版權信息: www.??easystudy.com
* @技術(shù)交流: 961179337(QQ群)
* @編寫(xiě)作者: lixx204ヾ(′?`)?[email protected]
* @聯(lián)系方式: 941415509(QQ)
* @開(kāi)發(fā)日期: 2020年(nian)9月21日
* @歷史版本: V1.0
* @備注信息:
*/
@RestController
@RequestMapping("/test??")
public class TestController {

/**
* @功能描述: 發(fā)送請求接口
* @版權信息: www.easystudy.com
* @編寫(xiě)作者ヽ(′▽?zhuān)?ノ: [email protected]
* @開(kāi)(╥_╥)發(fā)日期: 2020年9月21日
* @備注ヽ(′ー`)ノ信息:
*/
@SuppressWarnings("unuse??ヽ(′▽?zhuān)?ノd")
@GetMapping("/send")
public String reponseMsgToClient(@RequestPa(′_ゝ`)ram(name="content", required = truヽ(′ー`)ノe)String content) thr??ows Exception{
System.out??.println("開(kāi)始發(fā)送圖片數據");

// 隨機選擇一張(°□°)圖片發(fā)送
int index = new Random()(/ω\).nextInt(4) + 1;
String imgName = index + ".jpg";

// 判斷圖片是否存(′▽?zhuān)?在
URL url = getClass().ge??tClassLoader().getResource(imgName);
File file = new File(url.getFile());
if (!file.exists??()) {
return "未找到圖片!";
}

// 創(chuàng )建輸入圖片流
InputStream in = new FileI(′▽?zhuān)?)np??utStream???(file);
if (null == in) {
return "打開(kāi)文件失敗!";
}

// 讀取圖片數據
int size = (int)file.length();
byte[] buffer = new byte[ siz┐(′ー`)┌e];
int coun(?_?;)t = in.read(buffer, 0, si(′▽?zhuān)?ze);
System.out.println("文件長(cháng)度:"?? + size + ", 讀取長(cháng)度:" + count);

// 發(fā)送圖片數據(理論上講應該只??發(fā)對(???)端連接的)
ImgEndPoint.fanoutMessage(buffer);

// 關(guān)閉文件流
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}

// 接口響應
ret??urn "消息【" +c??ontent+ "】發(fā)送成功!";
}
}

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

播放效果如下:

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

來(lái)源:腳??本之家

鏈接:htヽ(′▽?zhuān)?ノtps://www( ?ω?).jb51.n( ???)et/html5/74??6110.html??

亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费 临沂市| 山东省| 扶绥县| 苍梧县| 普兰店市| 奇台县| 扶绥县| 营口市| 天全县| 香河县| 遵义县| 江阴市| 昭觉县| 西青区| 平湖市| 高州市| 崇文区| 拜泉县| 阳西县| 皋兰县| 东辽县| 丽水市| 淮南市| 勃利县| 金湖县| 梅河口市| 九江市| 灌南县| 保德县| 嘉义市| 新和县| 海晏县| 四川省| 黎川县| 沁源县| 泸水县| 旬邑县| 鹤峰县| 连江县| 武功县| 望奎县| http://444 http://444 http://444 http://444 http://444 http://444