惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
H
Help Net Security
腾讯CDC
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
有赞技术团队
有赞技术团队
美团技术团队
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 司徒正美
博客园_首页
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
B
Blog RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
Docker
博客园 - Franky
Jina AI
Jina AI

博客园 - 3D入魔

make编译时fatal error: codecvt: No such file or directory解决方法 c++ 输入文件流ifstream用法详解[转] Ubuntu下,已经编译了OSG,如何增加OsgFbx插件,支持读取.fbx格式文件[转] vscode一键配置C/C++多个C及CPP文件编译与tasks.json和launch.json原理【转】 ecvt()、strtod()、strtoul() sscanf,sscanf_s及其相关用法[转] OSG3.4.0静态库编译(VS2019) 新手填坑--国产统信UOS操作系统上编译OpenScenGraph(OSG)3.4(附编译成果.so)2023年1月 GPL、BSD、MIT、Mozilla、Apache 和 LGPL 六种开源协议选择 一图解决 nodejs express multer 中文名乱码【转】 Cesium加载离线地图和离线地形【转】 WebXR 技术调研 - 在浏览器中构建扩展现实(XR)应用【转】 Cesium+vue 制作风流场【转】 pkg 打包node服务端 填坑记录!! 实景三维电子沙盘 Cesium建筑自定义光源效果[转] 数字孪生城市 三维数字沙盘+GIS = F3DGIS 实战!使用pano2vr生成html5全景页面【转】
Cesium 使用MediaStreamRecorder 或者MediaRecorder录屏并下...
3D入魔 · 2022-06-27 · via 博客园 - 3D入魔

Cesium录制canvas视频
利用H5 API MediaRecorder 并借用canvas.captureStream录制屏幕。

安装MediaRecorder 

npm install msr

直接上代码(vue下)

recorderCanvas () {
      let that = this
      let viewer = window.earth
      const stream = viewer.canvas.captureStream()
      const recorder = new MediaRecorder(stream, { MimeType: 'video/webm' })
      that.data = []
      recorder.ondataavailable = function (event) {
        if (event.data && event.data.size) {
          that.data.push(event.data)
        }
      }
      recorder.onstop = () => {
        that.url = URL.createObjectURL(new Blob(that.data, { type: 'video/webm' }))
        that.startDownload(that.url) // 这里创建a标签下载就好了
      }
      recorder.start()
      setTimeout(() => {
        recorder.stop()
      }, 10000)
    },

缺点:只能录制canvas, 页面其他dom录制不了。

附加个打开摄像头录像的,同样采用MediaRecorder 或者 MediaStreamRecorder ,MediaStreamRecorder 提供了更多控制手段,需要把相应的js文件引入。

MediaStreamRecorder GitHub地址

MediaRecorder 方式

注意点,建立MediaRecorder实例时,要正确设置mimeType的值,否则,下载下来的视频会是黑屏,另外视频格式chrome好像只支持wemp格式。

调用MediaRecorder.stop()并不会关闭摄像头,需要手动stream.getTracks关闭视频和音频。

makeRecordes () {
      if (navigator.mediaDevices) {
        console.log('getUserMedia supported.')
 
        var constraints = { audio: true, video: { width: 1280, height: 720 } }
        var chunks = []
        let that = this
        navigator.mediaDevices.getUserMedia(constraints)
          .then(function (stream) {
            var mediaRecorder = new MediaRecorder(stream, { mimeType: 'video/webm;codecs=vp8,opus' })
 
            mediaRecorder.start()
            mediaRecorder.ondataavailable = function (e) {
              chunks.push(e.data)
            }
            setTimeout(() => {
              mediaRecorder.stop()
              // 关闭摄像头
              stream.getTracks().forEach(function (track) {
                track.stop()
              })
              mediaRecorder.onstop = () => {
                const videoBlob = new Blob(chunks, { 'type': 'video/webm' })
                let videoUrl = window.URL.createObjectURL(videoBlob)
                that.startDownload(videoUrl)
              }
            }, 10000)
          })
          .catch(function (err) {
            console.log('The following error occurred: ' + err)
          })
      }
    },

如果你需要更多的控制,比如暂停,又不想自己实现,那就用MediaStreamRecorder

同样要正确设置值mimeType,否则录得视频会黑屏。

makeRecordesByMSR () {
      if (navigator.mediaDevices) {
        console.log('getUserMedia supported.')
 
        var constraints = { audio: true, video: { width: 1280, height: 720 } }
        navigator.mediaDevices.getUserMedia(constraints)
          .then(function (stream) {
            // eslint-disable-next-line no-undef
            var mediaRecorder = new MediaStreamRecorder(stream)
            mediaRecorder.stream = stream
            mediaRecorder.width = window.screen.width
            mediaRecorder.height = window.screen.height
            mediaRecorder.mimeType = 'video/webm;codecs=vp8,opus'
            mediaRecorder.ondataavailable = function (blob) {
              mediaRecorder.save(blob, 'myName.webm')
            }
            mediaRecorder.start(6000)
 
            setTimeout(() => {
              mediaRecorder.stream.stop()
            }, 12000)
          })
          .catch(function (err) {
            console.log('The following error occurred: ' + err)
          })
      }
    }


原文链接:https://blog.csdn.net/qq_42081843/article/details/119005254