前端录制屏幕getDisplayMedia方法的视频分片问题
一、问题
最近在使用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方法的视频分片问题的更多相关文章
- oppor9手机怎么录制屏幕视频
我们已经进入互联网时代,每个人都寸步不离手机.电脑等电子产品,看到美丽好看的视频总想记录下来,毕竟看到喜欢的视频还真不太容易,所以问题来了,oppor9手机怎么录制屏幕视频呢?安卓手机上怎么录制屏幕视 ...
- Android 录制屏幕的实现方法
Android 录制屏幕的实现方法 Chrome 2017-02-15 15:32:01 发布 您的评价: 5.0 收藏 0收藏 长久以来,我一直希望能够直接从Androi ...
- WebRTC本地分享屏幕,录制屏幕
WebRTC有分享屏幕的功能.使用的是getDisplayMedia方法.用户同意分享屏幕后,可以拿到视频流. 再结合MediaRecorder和Blob,把视频流数据存下来,就能得到录制屏幕的视频. ...
- C#实现录制屏幕
以前写过两篇录制麦克风语音和摄像头视频的文章(实现语音视频录制.在服务器端录制语音视频),最近有朋友问,如果要实现屏幕录制这样的功能,该怎么做了?实际上原理是差不多的,如果了解了我前面两篇文章中介绍的 ...
- 【Android Studio安装部署系列】二十六、Android studio录制屏幕并生成gif文件
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio自带录制屏幕功能,那么就可以很方便地将手机上的屏幕操作录制成视频.然后借助一些软件或者网站转换成gif文 ...
- Vivox9怎么录制屏幕
手机怎么录屏是很多手机党一直提出的问题,而且经常发生录制的视频没有声音的现象,现在就给大家推荐一款软件,不仅能完美的录制视频,而且还可以完整的将视频声音录制下来,下面看看Vivox9怎么录制屏幕吧! ...
- iOS ReplayKit实时录制屏幕实现方案的细节记录
项目有个需求,需要把ios设备上的操作画面实时传输出去,也就是类似推流手机直播画面的方案. 一番调研后发现在ios中,我们可以通过ios自带ReplayKit框架实现. 关于ReplayKit的讲解, ...
- Ubuntu下录制屏幕并转换成gif【转】
本文转载自:https://blog.csdn.net/u012964944/article/details/50464263 *录制屏幕 1)打开Ubuntu软件中心,安装RecordMyDeskt ...
- C#录制屏幕采集系统桌面画面
在项目中,有很多需要录制屏幕的场景,比如直播课,录制教学视频等场景.但.NET自带的Screen类功能比较弱,效率很低.那么如何简单快捷地高效采集桌面屏幕呢?当然是采用SharpCapture!下面开 ...
- javaCV开发详解之12:视频转apng动态图片实现,支持透明通道,也支持摄像机、桌面屏幕、流媒体等视频源转apng动态图
wjavaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG. ...
随机推荐
- mac 如何开启指定端口供外部访问?
前言 需要 mac 上开放指定端口,指定 ip 访问 解决 在 macOS 上开放一个端口,并指定只能特定的 IP 访问,可以使用 macOS 内置的 pfctl(Packet Filter)工具来实 ...
- python 更新pip镜像源
前言 默认情况下 pip 使用的是国外的镜像,在下载的时候速度非常慢,下载速度是几kb或者几十kb,花费的时间比较长. 解决办法 国内目前有些机构或者公司整理了对应的镜像源,使得通过内网就能访问即可, ...
- 模型蒸馏(Distillation)案例--从DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏
DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏(Distillation) 本文重点进行DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏(Di ...
- ESX与ESXi区别
VMware ESXi 与ESX 产品之比较 VMware vSphere 5.0 以后版本,所有底层虚拟化产品都改为ESXi产品,本文主要比较了ESXi与ESX的各自特点,以便对大家是否要把现有的E ...
- Python提取pdf文字信息
目录 Python提取pdf文字信息 需求 代码 总结 Python提取pdf文字信息 需求 今天教务处导出来我们全年级的成绩,一看吓一跳,我们的名字怎么不在文件名里,只能一个个找吗.事情开始变得离谱 ...
- MySQL-全句锁、表锁和元数据锁
全局锁 全局锁是锁住整个数据库实例,只能读,任何关于更新操作的语句都会阻塞. 全局锁的适用场景 针对数据库做全库的逻辑备份操作时,需要使用全局锁. 全局锁的影响: 如果在主库上做全局锁操作,业务基本停 ...
- 微信 dat 文件还
荐
前言 以微信 PC 端为例 某个小姐姐/小哥哥通过微信发给你的图片会在以下目录以 .dat 后缀的格式出现 C:\Users\taadis\Documents\WeChat Files\taadis\ ...
- python练习-爬虫
场景: 1.网址hppt://xxx.yyy.zzz.cn2.打开网页后显示 : 3.填上姓名 身份证和验证码,点击查询后,返回查询结果. 4.页面有cookie. 方案一: 程序中嵌入浏览器根据网址 ...
- 调用 restful的api的方法
var // myurl : string; tmpstr : String;// string; RespData :TStringStream; sendData : TStringList; j ...
- 在AI大爆发的背景下,企业管理软件有什么冲击
今天与同行开会提到在AI大爆发的背景下,未来企业管理软件究竟有什么冲击? 我和同事对此问题进行了探讨,一些拙见,与大家分享.先直接说观点:在未来的5到10年,制造业的管理软件市场将几乎消失.下面我来聊 ...