原理就是通过canvas实时获取摄像头每一帧数据转换成base64传给websocket服务器进行中转,代码如下:
1、用swool搭建一个websocket服务器来中转视频信号数据
<?php2、视频信号采集后发布到websocket服务器
$server = new swoole_websocket_server("0.0.0.0", 8080);
$server->on('message', function (swoole_websocket_server $server, $frame) {
foreach($server->connection_list() as $fd) {
$server->push($fd, $frame->data,true);
}
});
$server->start();
<html>3、最后是观看直播页面
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>录制页面</title>
</head>
<body>
<video autoplay id="sourcevid" style="width:640px;height:480px"></video>
<canvas id="output" style="display:none"></canvas>
<script type="text/javascript" charset="utf-8">
if( document.createElement('canvas').getContext ) {
var socket = new WebSocket("ws://"+document.domain+":8080"),
back = document.getElementById('output'),
backcontext = back.getContext('2d'),
video = document.getElementsByTagName('video')[0];
socket.onopen = function() {
draw();
}
var success = function(stream) {
video.src = window.URL.createObjectURL(stream);
}
var draw = function() {
try {
backcontext.drawImage(video,0,0, back.width, back.height);
} catch(e) {
if (e.name == "NS_ERROR_NOT_AVAILABLE") {
return setTimeout(draw, 100);
} else {
throw e;
}
}
socket.send(back.toDataURL("image/jpeg", 0.5));
setTimeout(draw, 100);
}
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
navigator.getUserMedia({video:true, audio:false}, success, console.log);
} else {
alert('你的浏览器不支持html5,请先更换浏览器。。');
}
</script>
</body>
</html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>客户端直播页面</title>
</head>
<body>
<img id="receiver" style="width:720px;height:480px">
<script type="text/javascript" charset="utf-8">
var receiver_socket = new WebSocket("ws://"+document.domain+":8080");
var image = document.getElementById('receiver');
receiver_socket.onmessage = function(data) {
image.src = data.data;
}
</script>
</body>
</html>
网友回复
为啥所有的照片分辨率提升工具都会修改照片上的图案细节?
js如何在浏览器中将webm视频的声音分离为单独音频?
微信小程序如何播放第三方域名url的mp4视频?
ai多模态大模型能实时识别视频中的手语为文字吗?
如何远程调试别人的chrome浏览器获取调试信息?
为啥js打开新网页window.open设置窗口宽高无效?
浏览器中js的navigator.mediaDevices.getDisplayMedia屏幕录像无法录制SpeechSynthesisUtterance产生的说话声音?
js中mediaRecorder如何录制window.speechSynthesis声音音频并下载?
python如何直接获取抖音短视频的音频文件url?
js在浏览器中如何使用MediaStream与MediaRecorder实现声音音频多轨道混流?