前端录制视频

js export class VideoRecording { // 录视频 mediaRecorder: MediaRecorder | null; stream: MediaStream | null; chunks: any[]; endCallback: any[]; constructor() { this.mediaRecorder = null; // 录音对象 this.stream = null; // 轨道 this.chunks = []; // 录制缓存 this.endCallback = []; // 结束回调 } create() { // 创建一个录制任务 return new Promise((resolve, reject) => { this.resetState(); navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then((stream) => { this.stream = stream; const mime = MediaRecorder.isTypeSupported("video/webm\;codecs=h264") ? "video/webm\;codecs=h264" : "video/webm"; this.mediaRecorder = new MediaRecorder(stream, { mimeType: mime }); resolve({format: mime === "video/webm\;codecs=h264" ? 'mp4': 'webm'}); }).catch((err) => { reject(err); }); }); } start() { // 开始 return new Promise((resolve, reject) => { this.judgeMediaRecorderIs().then((mediaRecorder: MediaRecorder) => { mediaRecorder.start(); mediaRecorder.addEventListener('dataavailable', (e) => { this.chunks.push(e.data); this.endCallback.forEach((resolve) => { resolve(); this.endCallback.shift(); }); }); resolve(''); }).catch((err) => { reject(err); }); }); } stop() { // 结束 return new Promise((resolve, reject) => { this.judgeMediaRecorderIs().then((mediaRecorder: MediaRecorder) => { if (mediaRecorder.state === 'inactive') { return reject({code: 0, message: '已结束'}); }; mediaRecorder.stop(); this.stream.getTracks().forEach((track) => { track.stop(); }) this.endCallback.push(resolve); }).catch((err) => { reject(err); }); }); } download() { // 下载 return new Promise((resolve, reject) => { this.handleChunksToBolb().then((blob: Blob) => { let url = URL.createObjectURL(blob); let a = document.createElement('a'); a.href = url; a.download = MediaRecorder.isTypeSupported("video/webm\;codecs=h264") ? 'video.mp4' : 'video.webm'; a.click(); resolve(url); }).catch((err) => { reject(err); }); }); } viewRecording() { // 获取本地播放url return new Promise((resolve, reject) => { this.handleChunksToBolb().then((blob: Blob) => { let url = URL.createObjectURL(blob); resolve(url); }).catch((err) => { reject(err); }); }); } toFile() { // 录音缓存转file return new Promise((resolve, reject) => { this.handleChunksToBolb().then((blob: Blob) => { let filename = MediaRecorder.isTypeSupported("video/webm\;codecs=h264") ? 'video.mp4' : 'video.webm'; let fileType = filename.includes('.mp4') ? 'video/mp4' : 'video/webm'; resolve(new File([blob], filename, { type: fileType })); }).catch((err) => { reject(err); }); }); } handleChunksToBolb() { // 录音缓存转bolb return new Promise((resolve, reject) => { this.judgeChunksIs().then((chunks: any) => { let blob = new Blob(chunks, { type: MediaRecorder.isTypeSupported("video/webm\;codecs=h264") ? 'video/mp4' : chunks[0].type }) resolve(blob); }).catch((err) => { reject(err); }); }); } judgeChunksIs() { // 判断是否有录音缓存 return new Promise((resolve, reject) => { let chunks = this.chunks; if (chunks.length === 0) { return reject({code: 0, message: '没有录制的缓冲'}); }; return resolve(chunks); }); } judgeMediaRecorderIs() { // 判断是否创建录制任务 return new Promise((resolve, reject) => { let mediaRecorder = this.mediaRecorder; if (!mediaRecorder) { return reject({code: 0, message: '请先创建一个录制对象'}); }; resolve(mediaRecorder); }); } setEndCallback(callback) { // 存录音结束回调 this.endCallback.push(callback); } resetState() { // 重置状态 this.chunks = []; this.mediaRecorder = null; this.stream = null; } };

实用方法

js let myVideoRecording = new VideoRecording(); @params res: { format: 'mp4', type: String; value: 'mp4' | 'webm'; 说明:当前支持的录制格式; } myVideoRecording.create().then((res: {format: 'mp4'}) => { // 开始录制 myVideoRecording.start(); // 可选择自己注册一个结束回调, 也可以调用stop()结束成功后执行下载、播放url、转file let endRecording = () => { // 下载到本地 myVideoRecording.download(); // 本地播放url myVideoRecording.viewRecording().then((srcObject) => {}); // 转file可上传到后台服务器 myVideoRecording.toFile().then((file) => {}); }; // 存结束录音回调函数 myVideoRecording.setEndCallback(endRecording); // 手动结束录屏,then后才可以下载、获取本地播放url、转file对象 myVideoRecording.stop().then(() => { // 下载到本地 myVideoRecording.download(); // 本地播放url myVideoRecording.viewRecording().then((srcObject) => {}); // 转file可上传到后台服务器 myVideoRecording.toFile().then((file) => {}); }); });

js前端录制视频mp4本地播放转file相关推荐

  1. js前端录音下载wav本地播放导出file

    前端录音 js export class SoundRecording{ // 录音 mediaRecorder: MediaRecorder | null; stream: MediaStream ...

  2. unity android视频录制sdk,Unity中保存EveryPlay录制视频到本地的解决方案

    五月 14.2018. 0 Comment 在Unity中使用EveryPlay录制视频时,有如下问题: 1. EveryPlay API(截止到现在,之后Final Version可能会增加)不支持 ...

  3. Unity3D视频在线本地播放之AVPro Video插件使用

    简单使用例子: 导入AvProVideo插件,没有的话留下邮箱: 1.在UGUI上播放: 在Hirearchy右键AvPro Video下添加MediaPlayer,添加视频    创建UGUI的一张 ...

  4. 前端 mediaRecorder 录制视频源代码实例,和本地播放器无法定位进度条问题分析和解决

    问题 mediaRecorder 本质上录制的是webm 当我们使用getUserMedia.MediaRecorder等API生成的webm视频时,会发现最终的webm是无法拖动进度条的 解决方案 ...

  5. 【工具】JS脚本|网页任意视频倍速播放(包括MOOC、本地视频、其他的视频)

      只要浏览器播放视频时用的是<video>,而且当前页面只有这一个视频,就可以用这个脚本.   刚好也是世界杯 CSDN 博客的活动了,虽然对活动没什么兴趣但是还是写一句和活动相关的话吧 ...

  6. 使用JS调用本地摄像头录制视频

    最近项目中使用到了录制视频功能,为了防止以后再次使用时不记得怎么使用,简单记录一下. function start() { TotalTimelenth=0; videoConstraints.dev ...

  7. 基于Vue3+Go本地视频管理与播放系统设计与实现

    博主介绍:某大厂从事多年后端开发(Go,C++),目前在学习前端项目,还是一名前端新手.喜欢思考一些实用的小项目并付诸实践.欢迎志同道合的小伙伴一起交流学习,同时希望得到大家的支持,如果您觉得博主的文 ...

  8. opencv录制视频 python_Python-OpenCV录制H264编码的MP4视频

    前言 因最近项目需求涉及计算机视觉相关内容,需要实现在Python录制视频,并且录制完成后可在浏览器前端中进行视频回放的功能:特写下此篇文章以记录整体实现过程. 2019-08-02 更新 之前一直在 ...

  9. Android 仿微信长按录制视频并播放的功能

    一.点击按钮进行录制 首先要获取摄像拍照的权限和读取权限 <uses-permission android:name="android.permission.CAMERA" ...

最新文章

  1. c 语言贪心钓鱼思路,2020届九年级中考语文复习教案:第4讲现代文阅读之概括(27页)-原创力文档...
  2. LINUX 触摸屏驱动
  3. sqoop导入-hdfs
  4. tomcat 、jsp、 servlet 、jstl版本对应
  5. 数据结构与算法笔记(三) 线性表(链式描述) 链表
  6. 关于线程插入函数如何用的问题
  7. 结对作业_代码复审= =
  8. 图机器学习在度小满风控中的应用
  9. Android IPC(一)跨进程通讯的几种方式、作用
  10. Java多线程进阶(三六)—— J.U.C之collections框架:DelayQueue
  11. 在线文本字符串转十六进制工具
  12. 虚拟化服务器安装方法,Citrix Xenserver:7.0虚拟化服务器安装详细图文教程
  13. 我的超长综合面经 ---- 北京大学 黄晔
  14. 【线代】矩阵转置性质及代码证明
  15. 【趣读官方文档】1.管家的抉择 (Android进程生命周期)
  16. Next generation sequencing (NGS)二代测序数据预处理与分析
  17. linux下运行workman,笔记:Linux(AWS Redhat)开机启动workman进程(/etc/rc.local必须是755权限)...
  18. JAVA学习路线图---(JAVA1234)
  19. 新浪微博僵粉(机器粉)识别方法
  20. Dispose 和 GC 注意点

热门文章

  1. 2104. 子数组范围和
  2. 成功者具备的十五种能力
  3. 深度学习——线性代数
  4. 数据岗位现状调查报告
  5. ES系列、Elasticsearch Suggester API(自动补全)
  6. 统计篇(六)-- 大数定律与中心极限定理
  7. Infineon TC297 reset 内容整理
  8. 随笔分类 - NoSql
  9. UE4 UE4 C++ Gameplay Abilities 的AttributeSet和GameplayEffect
  10. 介绍一些好的域名空间网站