一、问题

最近在使用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. Can't find PHP headers in /usr/include/php The php-devel package is required for use of this command.

    报错 phpize 编译扩展时,报错:Can't find PHP headers in /usr/include/php The php-devel package is required for ...

  2. Redis 原理 - Sorted Set (ZSet)

    Sorted Set (ZSet) 数据结构 Sorted Set (ZSet), 即有序集合, 底层使用 压缩列表(ziplist) 或者 跳跃表(skiplist) 使用 压缩列表(ziplist ...

  3. .net 跨域 config中配置

    <system.webServer> <validation validateIntegratedModeConfiguration="false" /> ...

  4. 正则表达式--java进阶day06

    1.正则表达式 2.正则表达式的规则.使用 3.字符类讲解 如图,单独一个a满足正则表达式的规则,所以返回true 当删去[]后,正则表达式中的规则就会变为必须是abc,否则不满足条件,即使有一个a ...

  5. 跳转程序控制语句:break、continue 以及死循环、标号

    1.break:结束循环,结束switch语句 . 案例:模拟用户登录密码,一共三次机会,初识密码为123456 我们之前学的方法可以完成这个案例,但是这种写法还存在问题 如图 明明已经输入了正确的密 ...

  6. 【单片机】滑稽AT89C52表情实现

    [单片机]滑稽AT89C52表情实现 零.原因 在群里看到了这样一个表情: 这是用51做的,刚好开发板上有8个小灯,想实现一下. 一.代码 新建工程,写入如下代码: #include<reg52 ...

  7. 实现Android键盘自适应

    实现Android键盘自适应 unit Unit13; interface uses System.SysUtils, System.Types, System.UITypes, System.Cla ...

  8. FDMemtable如何增加一条自身复制的记录

    procedure TFrame_Bill.CopyARecord; var lAFDmemtable : TFDMemTable; begin {$REGION '增加一条复制的记录'} try l ...

  9. java学习-7-捕获异常处理

    Java使用异常来表示错误,并通过try ... catch捕获异常:1.Error错误是你的程序无能为力的,也无法捕获的,比如内存耗尽,最终会由JVM进行捕获打印出信息.几乎听天由命.但是老手程序员 ...

  10. FastAPI依赖注入与上下文管理

    title: FastAPI依赖注入与上下文管理 date: 2025/04/07 00:28:04 updated: 2025/04/07 00:28:04 author: cmdragon exc ...