草庐IT

RecordRTC网页录制视频无法播放以及无时长问题

sugar_crush 2023-10-18 原文

在网页中录制屏幕
RecordRTC
文章后面贴在vue中的使用代码

2022.8.26更新此文:现在RecordRTC已经支持录制mkv格式的视频了,亲测mkv视频有时长还能自由拖动,害....

进入RecordRTC演示,第一个下拉框选择Full Screen,点击Start Recorfing开始录制

image.png

谷歌可以选择录制整个屏幕、某个应用窗口或者单个浏览器标签页,火狐只支持录制整个屏幕。其他没试过

停止录制后,点击Save to Disk保存视频,发现视频无法打开。
win10自带电视和电影、迅雷影音以及火狐浏览器都无法打开(仅谷歌浏览器能打开)

解决办法是第二个下拉框选中vp8格式进行录制。

但是问题又来了,视频能播放,但是视频没有时长,无法拖动进度条!!!

解决办法:

使用EBML.js处理视频blob,链接EBML.js
进入EBML.js,右键另存到项目中。

新建ebml.util.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)
}

在vue中使用:

npm install recordrtc -S

template:

<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>

script:

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

注意:受浏览器安全限制,只有localhost或者https的网站才支持录制屏幕,上线需要部署https

有关RecordRTC网页录制视频无法播放以及无时长问题的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从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""-

  2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为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

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过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

  5. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行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

  7. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的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

  8. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  9. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的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

  10. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

随机推荐