一、问题

最近在使用getDisplayMedia方法录制屏幕时遇到问题,总是在录制结束后才能得到全部的视频,最后通过查找资料发现有一个视频分片的配置参数,就是MediaRecorder: start() 方法中的timeslice参数。

timeslice 可选参数

要记录到每个 Blob 中的毫秒数。如果这 参数不包括在内,除非调用 requestData() 方法以获取 并触发创建新的媒体,否则整个媒体持续时间将记录到一个媒体中。

二、使用方法

start(timeslice) timeslice为切片的毫秒数值

const stream = await navigator.mediaDevices.getDisplayMedia({
video: true,
audio: true, // 如果需要录制音频,取消注释此行
});
mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start(1000); //切片毫秒数

三、完整示例代码

let chunks = []; // 确保 chunks 在全局作用域中定义
let mediaRecorder =[] export const startRecord = async (callback) => {
try {
console.log("正在请求屏幕录制权限..."); const stream = await navigator.mediaDevices.getDisplayMedia({
video: true,
audio: true, // 如果需要录制音频,取消注释此行
preferCurrentTab:false
}); mediaRecorder = new MediaRecorder(stream);
mediaRecorder.ondataavailable = event => {
console.log("Received data chunk of size:", event.data.size);
chunks.push(event.data);
};
mediaRecorder.onstart = () => {
console.log("Recording has started.");
};
mediaRecorder.start(1000); //切片毫秒数
console.log("屏幕录制已开始");
} catch (error) {
console.error("屏幕录制失败:", error);
}
}; /**
* 停止屏幕录制并压缩视频后发送到服务器
*/
export const stopRecordAndSendToServer = async () => {
try {
console.log("正在停止屏幕录制...");
mediaRecorder.stop(); await new Promise((resolve) => {
mediaRecorder.onstop = resolve;
});
console.log("chunks:",chunks);
const videoBlob = new Blob(chunks, {type: 'video/webm'});
chunks = []; const compressedVideoBlob = videoBlob; // 发送到后端服务器
const formData = new FormData();
formData.append('video', compressedVideoBlob); const response = await fetch('/upload/file', { // 替换为你的服务器端点
method: 'POST',
body: formData
}); if (!response.ok) {
throw new Error(`Server responded with status: ${response.status}`);
} console.log("视频已发送到后端");
} catch (error) {
console.error("发送视频到后端失败:", error);
} finally {
if (mediaRecorder && mediaRecorder.stream) {
const tracks = mediaRecorder.stream.getTracks();
tracks.forEach(track => track.stop());
}
}
}; // 使用方法
// startRecord();
// 录制一段时间后,调用stopRecordAndSendToServer来停止录制并发送视频,或者在mediaRecorder.ondataavailable中获取切片数据
// stopRecordAndSendToServer();

前端录制屏幕getDisplayMedia方法的视频分片问题的更多相关文章

  1. oppor9手机怎么录制屏幕视频

    我们已经进入互联网时代,每个人都寸步不离手机.电脑等电子产品,看到美丽好看的视频总想记录下来,毕竟看到喜欢的视频还真不太容易,所以问题来了,oppor9手机怎么录制屏幕视频呢?安卓手机上怎么录制屏幕视 ...

  2. Android 录制屏幕的实现方法

    Android 录制屏幕的实现方法 Chrome   2017-02-15 15:32:01 发布 您的评价:       5.0   收藏     0收藏 长久以来,我一直希望能够直接从Androi ...

  3. WebRTC本地分享屏幕,录制屏幕

    WebRTC有分享屏幕的功能.使用的是getDisplayMedia方法.用户同意分享屏幕后,可以拿到视频流. 再结合MediaRecorder和Blob,把视频流数据存下来,就能得到录制屏幕的视频. ...

  4. C#实现录制屏幕

    以前写过两篇录制麦克风语音和摄像头视频的文章(实现语音视频录制.在服务器端录制语音视频),最近有朋友问,如果要实现屏幕录制这样的功能,该怎么做了?实际上原理是差不多的,如果了解了我前面两篇文章中介绍的 ...

  5. 【Android Studio安装部署系列】二十六、Android studio录制屏幕并生成gif文件

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio自带录制屏幕功能,那么就可以很方便地将手机上的屏幕操作录制成视频.然后借助一些软件或者网站转换成gif文 ...

  6. Vivox9怎么录制屏幕

    手机怎么录屏是很多手机党一直提出的问题,而且经常发生录制的视频没有声音的现象,现在就给大家推荐一款软件,不仅能完美的录制视频,而且还可以完整的将视频声音录制下来,下面看看Vivox9怎么录制屏幕吧! ...

  7. iOS ReplayKit实时录制屏幕实现方案的细节记录

    项目有个需求,需要把ios设备上的操作画面实时传输出去,也就是类似推流手机直播画面的方案. 一番调研后发现在ios中,我们可以通过ios自带ReplayKit框架实现. 关于ReplayKit的讲解, ...

  8. Ubuntu下录制屏幕并转换成gif【转】

    本文转载自:https://blog.csdn.net/u012964944/article/details/50464263 *录制屏幕 1)打开Ubuntu软件中心,安装RecordMyDeskt ...

  9. C#录制屏幕采集系统桌面画面

    在项目中,有很多需要录制屏幕的场景,比如直播课,录制教学视频等场景.但.NET自带的Screen类功能比较弱,效率很低.那么如何简单快捷地高效采集桌面屏幕呢?当然是采用SharpCapture!下面开 ...

  10. javaCV开发详解之12:视频转apng动态图片实现,支持透明通道,也支持摄像机、桌面屏幕、流媒体等视频源转apng动态图

    wjavaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG. ...

随机推荐

  1. 关闭windows计划重启

    前言 windows 总是自动计划更新 解决方案 需要禁用服务 "Windows Update" 和 "更新 Orchestrator 服务" 首先去这里下载P ...

  2. IvorySQL 4.2 发布

    IvorySQL 4.2 已于 2025 年 1 月 13 日正式发布.新版本全面支持 PostgreSQL 17.2,并修复了多项 bug. 增强功能 PostgreSQL 17.1 增强功能 确保 ...

  3. CISCN&CCB半决赛_2025_PWN_WP

    CISCN&CCB半决赛_2025_PWN_WP 前言: 记录一下第一次打半决赛国赛,总结来说还是自己太菜了,还有check脚本是真的很shi,正规军白给了... typo break edi ...

  4. VMware ESXi系统

    esxi全称"VMware ESXi",是可直接安装在物理服务器上的强大的裸机管理系统,是一款虚拟软件,不需安装其他操作系统,是VMware服务器虚拟化的基础.通过直接访问并控制底 ...

  5. AI穿上身:苹果手表如何改变你的生活?

    楔子:一个普通理工男的科技启示录 我是张三,一个标准的90后理工男.在这个日新月异的科技时代,我习惯用精密的逻辑和近乎机械的效率来审视世界.每天早上6点45分准时起床,每一分钟都被精确地规划,生活就像 ...

  6. 使用SPA单页面跟MPA多页面的优缺点?

    SPA vs MPA 深度解析 1. 概述 什么是 SPA? SPA(Single Page Application,单页面应用)是一种仅加载一个 HTML 页面,并通过 JavaScript 动态更 ...

  7. ELF-Virus简易病毒程序分析

    系统功能概述 ELF-Virus实现了一个简单的病毒程序,能够感染当前目录下的ELF格式的可执行文件.病毒程序通过将自身代码附加到目标文件中,并在文件末尾添加一个特定的签名来标记文件已被感染.感染后的 ...

  8. C# using 别名

    场景重现 当using的多个库出现类名重复的情况时... 解决办法 使用类的完全限定名称,例如: // 不需要using,避免using名称重复导致的异常 // 使用类的完全限定名称,俗称全名. Sy ...

  9. AR 智能生态鱼缸组态远控平台 | 图扑软件

    在工业 4.0 和物联网技术的推动下,万物互联正重塑行业管理模式.组态远控系统作为高效管控的核心,打破了设备孤立状态,实现数据实时交互.以智能生态鱼缸为例,图扑软件低代码数字孪生平台通过集成前沿技术, ...

  10. Hyperledger Fabric - 自定义createChannel命令

    前提条件 启动上一步的自定义network网络 ./network-myself.sh up 拷贝配置文件 以下文件是配置文件及相关脚本文件: mkdir configtx #创建配置文件目录 cp ...