Android录制屏幕的实现方法

*原文:Paul Kinlan
翻译:Agora.io*web

长久以来,我一直但愿可以直接从Android屏幕上进行录制并将其编码为多种格式,以便将录制内容嵌入在任意位置,而不须要安装任何软件。chrome

现在,咱们已经接近这个目标。Chrome团队正在添加一种功能,能够经过getUserMedia从Android设备上共享屏幕。我建立了一个原型来录制屏幕并将录制内容流式传输到其余设备,以便将其录制到文件并为其添加设备帧。架构

虽然WebRTC有不少复杂的细节,但整体而言,该基础架构并无那么复杂。app

录制过程分为两个阶段:ide

1.在本地捕获(并可选择在本地录制);
2.传输到远程桌面。编码

捕获屏幕url

getUserMedia是一个十分有用的API。经过它可直接在网页中之内联方式实时访问任何摄像头或麦克风。getUserMediaAPI可用于请求仅链接到某些类型的设备。例如,经过设置参数{audio: true},可请求仅链接至支持音频的设备,而经过设置{video:{'mandatory': {width:1920, height:1080}}},可指示仅链接至高清摄像头。翻译

Chrome即将推出一个新的参数{'chromeMediaSource':'screen'},该参数制定Chrome应使用屏幕做为流媒体源。code

它当前位于标记以后,彻底是实验性质。在Android上,须要开启chrome://flags#enable-usermedia-screen-capturing来启用它。您也能够跟踪Chrome错误487935的实现状况。rem

const constraints = {
audio: false, // mandatory.
video: {'mandatory': {'chromeMediaSource':'screen'}}
};
const successCallback = (stream) => {
// Do something with the stream.
//Attach to WebRTC connections
//Record via MediaRecorder
};
consterrorCallback = () => {
//We don't have access to the API
};
navigator.getUserMedia(constraints,successCallback, errorCallback);

这就是所有代码。

固然,这是从技术上而言。在实际中,您不会直接得到访问权限。用户须要向getUserMedia的媒体流授予访问权限(与往常同样),因为此API的这项功能十分强大,用户必须明确选择使用它才能共享本身的屏幕。一旦用户明确选择使用此功能,系统就会明确指示他们在共享屏幕。

如今,您已经有了可存储在本地的屏幕流,您也能够经过WebRTC将它传输到外部位置。

经过MediaRecorder可在本地录制屏幕,正如我在WebGL录制代码段中所作的那样。我还建立了一个简单的演示,可对屏幕录制10秒,再将录制的内容下载到您的设备上。

(function(){
//Download locally
functiondownload(blob) {
varurl = window.URL.createObjectURL(blob);
vara = document.createElement('a');
a.style.display= 'none';
a.href= url;
a.download= 'test.webm';
document.body.appendChild(a);
a.click();
setTimeout(function(){
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
},100);
}
constsuccessCallback = (stream) => {
//Set up the recorder
letblobs = [];
letrecorder = new MediaRecorder(stream, {mimeType: 'video/webm; codecs=vp9'});
recorder.ondataavailable= e => { if (e.data && e.data.size > 0) blobs.push(e.data)};
recorder.onstop= (e) => download(new Blob(blobs, {type: 'video/webm'}));
//Record for 10 seconds.
setTimeout(()=>recorder.stop(), 10000);
//Start recording.
recorder.start(10);// collect 10ms chunks of data

};consterrorCallback = (err) => {//We don't have access to the APIconsole.log(err)};navigator.getUserMedia({audio:false,video:{'mandatory': {'chromeMediaSource':'screen'}}},successCallback, errorCallback);})();

相关文章
相关标签/搜索