在网页中录制屏幕
RecordRTC
文章后面贴在vue中的使用代码
进入RecordRTC演示,第一个下拉框选择Full Screen,点击Start Recorfing开始录制

谷歌可以选择录制整个屏幕、某个应用窗口或者单个浏览器标签页,火狐只支持录制整个屏幕。其他没试过
停止录制后,点击Save to Disk保存视频,发现视频无法打开。
win10自带电视和电影、迅雷影音以及火狐浏览器都无法打开(仅谷歌浏览器能打开)
vp8格式进行录制。使用EBML.js处理视频blob,链接EBML.js
进入EBML.js,右键另存到项目中。
import { Decoder, tools, Reader } from './EBML.js'
/**
* @param {Blob} file - File or Blob object.
* @param {function} callback - Callback function.
* @example
* getSeekableBlob(blob or file, callback);
* @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}
*/
export function getSeekableBlob(inputBlob, callback) {
const reader = new Reader()
const decoder = new Decoder()
const tool = tools
const fileReader = new FileReader()
fileReader.onload = function(e) {
const ebmlElms = decoder.decode(this.result)
ebmlElms.forEach(function(element) {
reader.read(element)
})
reader.stop()
const refinedMetadataBuf = tool.makeMetadataSeekable(
reader.metadatas,
reader.duration,
reader.cues
)
const body = this.result.slice(reader.metadataSize)
const newBlob = new Blob([refinedMetadataBuf, body], {
type: 'video/webm'
})
callback(newBlob)
}
fileReader.readAsArrayBuffer(inputBlob)
}
npm install recordrtc -S
<template>
<div class="record-page">
<div style="margin-bottom: 15px;">
<button @click="startRecording" :disabled="isReacoding">
开始录制
</button>
<button @click="pauseRecord" :disabled="!isReacoding || isPaused">
暂停录制
</button>
<button @click="keepRecord" :disabled="!isReacoding && !isPaused">
继续录制
</button>
<button
@click="stopRecording"
:disabled="!isReacoding"
id="btn-stop-recording"
>
结束并保存
</button>
</div>
<video
controls
autoplay
playsinline
ref="video"
width="400"
height="300"
></video>
</div>
</template>
import RecordRTC from 'recordrtc'
import { getSeekableBlob } from './ebml.util.js'
export default {
name: 'screenRecord',
data() {
return {
video: null,
isReacoding: false,
isPaused: false,
recorder: null
}
},
//检测浏览器是否支持屏幕录制的api
created() {
if (!navigator.getDisplayMedia && !navigator.mediaDevices.getDisplayMedia) {
let error = 'Your browser does NOT support the getDisplayMedia API.'
throw new Error(error)
}
},
mounted() {
this.video = document.querySelector('video')
},
methods: {
invokeGetDisplayMedia(success, error) {
let displaymediastreamconstraints = {
video: true
}
if (navigator.mediaDevices.getDisplayMedia) {
navigator.mediaDevices
.getDisplayMedia(displaymediastreamconstraints)
.then(success)
.catch(error)
} else {
navigator
.getDisplayMedia(displaymediastreamconstraints)
.then(success)
.catch(error)
}
},
captureScreen(callback) {
this.invokeGetDisplayMedia(
screen => {
this.addStreamStopListener(screen, () => {
//
})
callback(screen)
},
function(error) {
console.error(error)
alert(
'Unable to capture your screen. Please check console logs.\n' +
error
)
}
)
},
addStreamStopListener(stream, callback) {
stream.addEventListener(
'ended',
function() {
callback()
callback = function() {}
},
false
)
stream.addEventListener(
'inactive',
function() {
callback()
callback = function() {}
},
false
)
stream.getTracks().forEach(function(track) {
track.addEventListener(
'ended',
function() {
callback()
callback = function() {}
},
false
)
track.addEventListener(
'inactive',
function() {
callback()
callback = function() {}
},
false
)
})
},
// 开始录制
startRecording() {
this.captureScreen(screen => {
this.video.srcObject = screen
this.recorder = RecordRTC(screen, {
type: 'video',
mimeType: 'video/webm\;codecs=vp8',
disableLogs: false,
getNativeBlob: false
})
this.recorder.startRecording()
// release screen on stopRecording
this.recorder.screen = screen
this.isReacoding = true
})
},
stopRecordingCallback() {
this.video.src = this.video.srcObject = null
this.video.src = URL.createObjectURL(this.recorder.getBlob())
this.download()
this.recorder.screen.stop()
this.recorder.destroy()
this.recorder = null
this.isReacoding = false
},
// 结束录制
stopRecording() {
this.recorder.stopRecording(this.stopRecordingCallback)
},
pauseRecord() {
this.recorder.pauseRecording()
this.isPaused = true
},
keepRecord() {
this.recorder.resumeRecording()
this.isPaused = false
},
// 结束后自动保存本地
download() {
getSeekableBlob(this.recorder.getBlob(), function(seekableBlob) {
const url = window.URL.createObjectURL(seekableBlob)
const link = document.createElement('a')
link.style.display = 'none'
link.href = url
const fileName = Date.now() + '.webm'
link.setAttribute('download', fileName)
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
})
}
}
}
参考:https://github.com/muaz-khan/RecordRTC/issues/147
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=