videoTest.blade.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. @extends('layouts.app')
  2. @section('title')查询-退货管理@endsection
  3. @section('content')
  4. <div class="container-fluid">
  5. <div class="d-none" id="list">
  6. <div class="row">
  7. <div class="left col-4 p-0">
  8. <h2>录制</h2>
  9. <div class="videoPreview">
  10. <video id="preview" width="50%" height="auto" autoplay muted controls></video>
  11. </div>
  12. <button class="btn-info btn" @click="startRecord(true)">录制</button>
  13. <button class="btn-danger btn" @click="stopRecord()">停止</button>
  14. </div>
  15. <div class="right col-4 p-0">
  16. <h2>播放</h2>
  17. <div class="videoRecording">
  18. <video id="recording" width="50%" height="auto" controls></video>
  19. </div>
  20. <button class="btn-success btn" @click="playRecord()">播放</button>
  21. <button class="btn btn-outline-secondary" @click="downloadRecord()">下载</button>
  22. </div>
  23. <div class="right col-4 p-0">
  24. <h2>拍照</h2>
  25. <div id="drag" class="col-4 p-0" style="position:fixed;bottom: 30px;left: 10px;">
  26. <video id="photo" width="50%" height="auto" controls></video>
  27. </div>
  28. <div>
  29. <canvas id='canvas'width='400' height='300'></canvas>
  30. <img id='img' src=''>
  31. </div>
  32. <button class="btn-success btn" @click="enableCamera(true)">开启摄像头</button>
  33. <button class="btn-success btn" @click="takePhoto()">拍照</button>
  34. </div>
  35. </div>
  36. </div>
  37. </div>
  38. @endsection
  39. @section('lastScript')
  40. <script>
  41. $(function() {
  42. let posX;
  43. let posY;
  44. let drag = document.getElementById("drag");
  45. drag.onmousedown = function(e) {
  46. posX = event.x - drag.offsetLeft; //获得横坐标x
  47. posY = event.y - drag.offsetTop; //获得纵坐标y
  48. document.onmousemove = mousemove; //调用函数,只要一直按着按钮就能一直调用
  49. }
  50. document.onmouseup = function() {
  51. document.onmousemove = null; //鼠标举起,停止
  52. }
  53. function mousemove(ev) {
  54. if (ev == null) ev = window.event; //IE
  55. console.log(window.event)
  56. drag.style.left = (ev.clientX - posX) + "px";
  57. drag.style.top = (ev.clientY - posY) + "px";
  58. }
  59. })
  60. let MediaUtils = {
  61. /**
  62. * 获取用户媒体设备(处理兼容的问题)
  63. * @param videoEnable {boolean} - 是否启用摄像头
  64. * @param audioEnable {boolean} - 是否启用麦克风
  65. * @param callback {Function} - 处理回调
  66. */
  67. getUserMedia: function (videoEnable, audioEnable, callback) {
  68. navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia
  69. || navigator.msGetUserMedia || window.getUserMedia;
  70. let constraints = {video: videoEnable, audio: audioEnable};
  71. if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
  72. navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
  73. callback(false, stream);
  74. })['catch'](function (err) {
  75. callback(err);
  76. });
  77. } else if (navigator.getUserMedia) {
  78. navigator.getUserMedia(constraints, function (stream) {
  79. callback(false, stream);
  80. }, function (err) {
  81. callback(err);
  82. });
  83. } else {
  84. callback(new Error('Not support userMedia'));
  85. }
  86. },
  87. /**
  88. * 关闭媒体流
  89. * @param stream {MediaStream} - 需要关闭的流
  90. */
  91. closeStream: function (stream) {
  92. if (typeof stream.stop === 'function') {
  93. stream.stop();
  94. } else {
  95. let trackList = [stream.getAudioTracks(), stream.getVideoTracks()];
  96. for (let i = 0; i < trackList.length; i++) {
  97. let tracks = trackList[i];
  98. if (tracks && tracks.length > 0) {
  99. for (let j = 0; j < tracks.length; j++) {
  100. let track = tracks[j];
  101. if (typeof track.stop === 'function') {
  102. track.stop();
  103. }
  104. }
  105. }
  106. }
  107. }
  108. }
  109. };
  110. // 用于存放 MediaRecorder 对象和音频Track,关闭录制和关闭媒体设备需要用到
  111. let recorder, mediaStream;
  112. // 用于存放录制后的音频文件对象和录制结束回调
  113. let recorderFile, stopRecordCallback;
  114. // 用于存放是否开启了视频录制
  115. let videoEnabled = false;
  116. let vueList = new Vue({
  117. el: "#list",
  118. data: {
  119. },
  120. mounted: function () {
  121. $(".tooltipTarget").tooltip({'trigger': 'hover'});
  122. $('#list').removeClass('d-none');
  123. },
  124. methods: {
  125. // 录制视频
  126. startRecord(enableVideo) {
  127. videoEnabled = enableVideo;
  128. MediaUtils.getUserMedia(enableVideo, true, function (err, stream) {
  129. if (err) {
  130. throw err;
  131. } else {
  132. let preview=document.getElementById('preview');
  133. // 通过 MediaRecorder 记录获取到的媒体流
  134. recorder = new MediaRecorder(stream);
  135. mediaStream = stream;
  136. preview.srcObject = stream;
  137. preview.captureStream =
  138. preview.captureStream || preview.mozCaptureStream;
  139. let chunks = [], startTime = 0;
  140. recorder.ondataavailable = function (e) {
  141. chunks.push(e.data);
  142. };
  143. recorder.onstop = function (e) {
  144. recorderFile = new Blob(chunks, {'type': recorder.mimeType});
  145. chunks = [];
  146. if (null != stopRecordCallback) {
  147. stopRecordCallback();
  148. }
  149. };
  150. recorder.start();
  151. }
  152. });
  153. },
  154. // 停止录制
  155. stopRecord(callback) {
  156. stopRecordCallback = callback;
  157. // 终止录制器
  158. recorder.stop();
  159. // 关闭媒体流
  160. MediaUtils.closeStream(mediaStream);
  161. },
  162. // 播放录制的视频
  163. playRecord() {
  164. let url = URL.createObjectURL(recorderFile);
  165. // let dom = document.createElement(videoEnabled ? 'video' : 'audio');
  166. let dom = document.getElementById('recording');
  167. dom.autoplay = true;
  168. dom.src = url;
  169. },
  170. // 下载录制视频
  171. downloadRecord(){
  172. let url = URL.createObjectURL(recorderFile);
  173. // 创建隐藏的可下载链接
  174. let eleLink = document.createElement('a');
  175. eleLink.download = new Date().getFullYear()+'download.mp4';
  176. // 字符内容转变成blob地址
  177. eleLink.href = url
  178. // 触发点击
  179. document.body.appendChild(eleLink);
  180. eleLink.click();
  181. // 然后移除
  182. document.body.removeChild(eleLink);
  183. },
  184. // 开启摄像头
  185. enableCamera(enableVideo) {
  186. videoEnabled = enableVideo;
  187. MediaUtils.getUserMedia(enableVideo, false, function (err, stream) {
  188. if (err) {
  189. throw err;
  190. } else {
  191. let photo=document.getElementById('photo');
  192. photo.srcObject = stream;
  193. photo.play();
  194. }
  195. });
  196. },
  197. // 关闭摄像头
  198. closeCamera() {
  199. let stream = document.getElementById('photo').srcObject;
  200. let tracks = stream.getTracks();
  201. tracks.forEach(function(track) {
  202. track.stop();
  203. });
  204. document.getElementById('photo').srcObject = null;
  205. },
  206. //拍照
  207. takePhoto(){
  208. let photo=document.getElementById('photo');
  209. let canvas=document.getElementById('canvas');
  210. //绘制canvas图形
  211. canvas.getContext('2d').drawImage(photo, 0, 0, 400, 300);
  212. let img = document.getElementById('canvas').toDataURL();
  213. // 这里的img就是得到的图片
  214. console.log('img-----', img);
  215. // document.getElementById('img').src=img;
  216. this.closeCamera();
  217. }
  218. }
  219. })
  220. </script>
  221. @endsection