李振海
2018-03-25 18:10:42
html5 pc端录制视频+MediaStreamRecorder
自己花了一天研究出来的 html 5 录制视频并上传到服务器 这方面资料太少了 尤其是中文资料
借鉴 SegmentFault https://segmentfault.com/q/1010000011489899
git官方 https://github.com/streamproc/MediaStreamRecorder
这俩个文档都有点坑 第一个 文档 弄出来 可以录制视频但是不能关闭摄像头 停止录制后 摄像头没有关,第二个 文档也就是 官方git 上的演示demo 可以用 但是录制后视频
刚开始不知道怎么回事 看了文档 以为视频 设置宽度有问题 改了宽度也不行,
后来研究俩个文档 终于 再第一个文档的基础上 结合官方文档 修复停止录制视频 时摄像头不关闭的问题 ,,并且发现俩个画面的原因 官方文档 multiStreamRecorder = new MultiStreamRecorder([stream, stream]);
想要一个画面就用这个 mediaRecorder = new MediaStreamRecorder(stream);
官方文档写的上传到PHP 服务器 我这里用的java后台 上传时还弄了 老半天 官方给出的
XMLHttpRequest 上传 之前没见过这玩意 弄了半天也不行 直接改成ajax 上传了
停止视频用 mediaRecorder.stop(); 的话 就会出现 不关闭摄像头的问题
后才用官方给的 mediaRecorder.stop(); mediaRecorder.stream.stop(); 但是我实际发现 用一个mediaRecorder.stream.stop(); 就够了
我把代码贴出来,
<video width="100%" height="480" id="myVideo"></video> </div> <button onclick="videolz()" type="button" class="btn btn-danger" style="width: 100%; font-size: 32px"><span class="glyphicon glyphicon-facetime-video" aria-hidden="true" id="videostr">视频描述</span></button>
// 判断浏览器 var root ="<%=basePath %>"; var aa = '' ; //防止两次上传 var mediaRecorder ; var index=1;//定时加1 var dingshi; var mediaConstraints = { audio: true, video: { width: 1280, height: 720 } }; function captureUserMedia(mediaConstraints, successCallback, errorCallback) { navigator.mediaDevices.getUserMedia(mediaConstraints).then(successCallback).catch(errorCallback); } function onMediaError(e) { } function onMediaSuccess(stream) { var video = document.querySelector('video'); // 赋值 video 并开始播放 video.srcObject = stream; video.onloadedmetadata = function(e) { video.play(); }; mediaRecorder = new MediaStreamRecorder(stream); mediaRecorder.stream = stream; /* // 录像api的调用 */ mediaRecorder.mimeType = 'video/mp4'; dingshi = window.setInterval(function(){ $("#videostr").html("保存视频"+index+"秒"); index++; } ,1000); mediaRecorder.start(12000000000); // 停止录像以后的回调函数 mediaRecorder.ondataavailable = function (blob) { if(aa == ""){ var file = new File([blob], 'msr-' + (new Date).toISOString().replace(/:|\./g, '-') + '.mp4', { type: 'video/mp4' }); var formData = new FormData(); formData.append('file', file); console.log(formData); $.ajax({ url : root+"/upload/video.do", type : "post", cache : false, data: formData, dataType : "json", processData: false, contentType: false, error : function() { alert("暂时无法操作,请刷新后再试!"); }, success : function(result) { if (result.code == 0) { var params = result.data; console.log(params); console.log(params.fileUrl); /* $("#lzvideo").attr("src", params.fileUrl); */ } else { } } }); aa = blob; } }; } function videolz(){ if( $("#videostr").text()=="视频描述"){ $("#videostr").html("保存视频"); $("#videostr").removeClass("glyphicon-facetime-video"); $("#videostr").addClass("glyphicon-pause") /* $("#videos").append("<video width=\"100%\" height=\"320px\" id=\"myVideo\"></video>") */ // 开始录像 $("#myVideo").show(); captureUserMedia(mediaConstraints, onMediaSuccess, onMediaError); }else{ $("#videostr").html("视频描述"); $("#videostr").addClass("glyphicon-facetime-video"); $("#videostr").removeClass("glyphicon-pause") /* $("#myVideo").remove(); */ // 停止录像 /* mediaRecorder.stop(); */ mediaRecorder.stream.stop(); /* $("#myVideo").unbind(); */ index=1; window.clearInterval(dingshi); } } </script>
/* * 上传视频 */ @RequestMapping(value="video") @ResponseBody public Result uoloadVideo(@RequestParam("file") MultipartFile file,Model model,HttpServletRequest request, HttpServletResponse response) { Result result = new Result(); Map<String, Object> data = new HashMap<String, Object>(); String serverPath = "/upload/" + new SimpleDateFormat("yyyyMM").format(new Date()) + "/"; String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort(); String filePath = request.getSession().getServletContext().getRealPath(serverPath); String fileName = UUID.randomUUID().toString().replaceAll("-", "") + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); String fileUrl = request.getContextPath() + serverPath + fileName; File targetFile = new File(filePath, fileName); if (!targetFile.exists()) { targetFile.mkdirs(); } try { file.transferTo(targetFile); System.out.println(basePath); data.put("fileUrl", basePath+fileUrl); result = new Result(0, "上传成功", data); } catch (Exception e) { result = new Result(1, "上传异常"); } return result; }
评论
最近浏览
uni-code_0123 LV1
2023年11月29日
fesfefe LV13
2023年9月21日
guiwater
2023年2月18日
暂无贡献等级
hapuren
2022年10月30日
暂无贡献等级
微信网友_6114200435855360 LV1
2022年9月1日
liys1234 LV9
2022年6月21日
13613768985 LV1
2022年5月13日
Kevin_001 LV6
2022年3月26日
admin888888 LV3
2021年8月7日
13543528515 LV8
2021年7月24日