Node.js调用本地摄像头拍摄上传

5 篇文章 0 订阅
4 篇文章 0 订阅

server.js

var express=require('express');
var fs=require('fs'); //文件操作
var bodyParser = require('body-parser');


var app=express(); //创建web应用程序
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());


//获取所有数据
app.post("/uploadPics",function(req,res){
    var bitmap=new Buffer(req.body.imageData,'base64');
    fs.writeFile("./images/"+new Date().getTime()+".jpg",bitmap,function(err){
        if(err){
            res.send("0");
        }else {
            res.send("1");
        }
        res.end();
    });
});


//获取user下面的静态文件
app.get("/*",function(req,res){
    res.sendFile(__dirname+req.url);
});


app.listen(6666);


index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>调用摄像头</title>
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="js/camera.js"></script>
<style type="text/css">
#camera_errbox {
width: 320px;
height: auto;
border: 1px solid #333333;
padding: 10px;
color: #fff;
text-align: left;
margin: 20px auto;
font-size: 14px;
}


#camera_errbox b {
padding-bottom: 15px;
}


.borderstyle{
-webkit-box-shadow:0 0 5px 3px rgba(255,0,0,.6),0 0 5px 6px rgba(0,182,0,.6),0 0 5px 10px rgba(255,255,0,.6);
-moz-box-shadow:0 0 5px 3px rgba(255,0,0,.6),0 0 5px 6px rgba(0,182,0,.6),0 0 5px 10px rgba(255,255,0,.6);
-ms-box-shadow:0 0 5px 3px rgba(255,0,0,.6),0 0 5px 6px rgba(0,182,0,.6),0 0 5px 10px rgba(255,255,0,.6);
-o-box-shadow:0 0 5px 3px rgba(255,0,0,.6),0 0 5px 6px rgba(0,182,0,.6),0 0 5px 10px rgba(255,255,0,.6);
box-shadow:0 0 5px 3px rgba(255,0,0,.6),0 0 5px 6px rgba(0,182,0,.6),0 0 5px 10px rgba(255,255,0,.6);
}


#navy_video{
float:left;
}


#canvas{
float:left;
margin-left:20px;
}


</style>
</head>
<body onLoad="init(this)" οncοntextmenu="return false" onselectstart="return false">
<center>
<video id="navy_video" width="320px" height="240px" autoplay class="borderstyle"></video>
<input id="snap" type="button" value="拍照"/>
<button οnclick="convertCanvasToImage()">保存</button>
<div id="camera_errbox">
<b>请点击“允许”按钮,授权网页访问您的摄像头!</b>
<div>若您并未看到任何授权提示,则表示您的浏览器不支持Media Capture或您的机器没有连接摄像头设备。</div>
</div>
<canvas id="canvas" width="160px" height="120px" class="borderstyle"></canvas>
</center>
</body>
</html>


camera.js

function init(t) {
accessLocalWebCam("navy_video");
}


window.URL = window.URL || window.webkitURL || window.msURL || window.oURL;
navigator.getUserMedia = navigator.getUserMedia|| navigator.webkitGetUserMedia || navigator.mozGetUserMedia|| navigator.msGetUserMedia;


function isChromiumVersionLower() {
var ua = navigator.userAgent;
var testChromium = ua
.match(/AppleWebKit\/.* Chrome\/([\d.]+).* Safari\//);
return (testChromium && (parseInt(testChromium[1].split('.')[0]) < 19));
}


function successsCallback(stream) {
document.getElementById('camera_errbox').style.display = 'none';
document.getElementById('navy_video').src = (window.URL && window.URL.createObjectURL) ? window.URL.createObjectURL(stream): stream;


}


function errorCallback(err) {


}


function accessLocalWebCam(id) {
try {
navigator.getUserMedia({
video : true
}, successsCallback, errorCallback);
} catch (err) {
navigator.getUserMedia('video', successsCallback, errorCallback);
}
}




window.addEventListener("DOMContentLoaded", function() {
var canvas = document.getElementById("canvas"), context = canvas
.getContext("2d"), video = document
.getElementById("navy_video"), videoObj = {
"video" : true
}, errBack = function(error) {
console.log("相机调用失败...", error.code);
};


if (navigator.getUserMedia) {
navigator.getUserMedia(videoObj, function(stream) {
video.src = stream;
video.play();
}, errBack);
} else if (navigator.webkitGetUserMedia) {
navigator.webkitGetUserMedia(videoObj, function(stream) {
video.src = window.webkitURL.createObjectURL(stream);
video.play();
}, errBack);
}


document.getElementById("snap").addEventListener("click", function() {
context.drawImage(video, 0, 0,$("#canvas").width(), $("#canvas").height());
});
}, false);




function convertCanvasToImage() {
var pic = document.getElementById("canvas").toDataURL("image/png");
pic = pic.replace(/^data:image\/(png|jpg);base64,/, "")


$.post('uploadPics',{imageData:pic},function(data){
data=parseInt($.trim(data));
if(data==0){
alert("图片上传失败...");
}else{
alert("图片上传成功...");
}
});
}


### 回答1: 搭建直播系统可以使用 Node.js 来实现。 1. 首先,你需要了解 Node.js 的基本概念和用法,并安装 Node.js 环境。 2. 其次,你可以使用 Node.js 搭建服务器,用于接收客户端的请求和发送响应。 3. 为了实现直播功能,你可以使用 Node.js 中的流 (stream) 模块。流模块可以帮助你实时地处理和传输数据。 4. 接下来,你可以使用 Node.js 框架,如 Express、Koa 等,来简化开发过程。 5. 最后,你可以使用 Node.js 的子进程 (child process) 模块,来调用第三方的转码工具,将视频流转换为浏览器可以播放的格式。 以上是 Node.js 搭建直播系统的一个大致流程。如果你还有其他问题,可以随时给我提问。 ### 回答2: Node.js搭建直播系统是一个可行的选择。Node.js是一个基于事件驱动的JavaScript运行环境,适合用于构建高性能、可扩展的网络应用。它的非阻塞I/O模型使得它能够处理大量并发连接,而直播系统通常需要支持大量的同时在线用户。 在搭建直播系统时,可以使用Node.js的一些主要特性来实现: 1. WebSocket通信:Node.js提供了WebSocket模块,用于实现双向通信。直播系统可以利用WebSocket来实现实时的音视频传输和弹幕互动功能。 2. 非阻塞I/O:Node.js的非阻塞I/O模型使其能够同时处理多个连接,对于直播系统来说非常重要。直播系统需要同时接收和处理来自多个用户的音视频数据流,并将其传输给其他用户。 3. 实时数据传输:直播系统需要实时传输音视频数据给观看者。Node.js可以利用其事件机制和非阻塞I/O,实时处理、编码和传输音视频数据流,使得观看者可以几乎实时地观看到直播内容。 4. 弹幕互动:Node.js可以使用WebSocket实现弹幕互动功能,通过实时将用户发送的弹幕消息广播给其他观众,提高用户互动性和参与度。 需要注意的是,搭建直播系统不仅仅需要Node.js,还需要其他配套的技术组件,如音视频编解码、推流服务器、存储系统等。Node.js作为后端服务器,负责接收用户请求、处理数据传输和处理业务逻辑。整个直播系统需要有一定的架构设计和规划,包括高可用性、负载均衡和容错机制等。 总之,通过使用Node.js可以快速搭建直播系统,实现高性能、实时的音视频传输和互动功能。通过充分发挥Node.js的特点,可以满足大量同时在线用户的需求。 ### 回答3: Node.js是一个基于Chrome V8引擎的JavaScript运行环境,可以用于搭建各种类型的应用程序,包括直播系统。 要搭建一个基于Node.js的直播系统,首先需要安装Node.js运行环境和相关的模块。接下来,可以使用Node.js的一些特性和插件来进行实时的视频流传输和处理。 一种常见的方法是使用WebRTC(Web实时通信)技术来实现直播功能。WebRTC是一种支持实时音视频传输的开放标准,可以在浏览器中直接使用。 对于搭建直播系统,我们可以通过Node.js提供的Express框架来创建一个服务器,并在该服务器上创建WebSocket连接,用于实现实时数据传输。通过使用WebRTC的API,可以获取用户的音视频流并进行传输。可以使用MediaStream对象来捕获摄像头和麦克风的输入,然后通过RTCPeerConnection对象将流传输到其他用户。 在服务器端,可以使用Node.js的一些流处理库来处理和转发音视频流。例如,可以使用Node Media Server来处理音视频流,并将其转发给其他用户。 除了直播功能,也可以使用Node.js来实现一些其他的功能,比如用户认证、聊天室、弹幕等等。 总之,通过使用Node.js和相关的技术,我们可以搭建一个功能强大的直播系统,实现实时的音视频传输和处理,并提供其他附加功能,以满足用户的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值