在 Shiny 中从 JavaScript 保存/导出 webm 视频到应用程序目录

Save / export webm videos to app directory from JavaScript in Shiny

我已经使用 RecordRTC 和 JavaScript 将网络摄像头视频捕获集成到 Shiny 应用程序中。效果很好,我可以访问我的视频并将其存储在名为 "video.blob" 的 JavaScript 变量中。但是,我很难在按下 "btn-save-recording" 按钮后将该文件导出到我的应用程序的闪亮目录中。

我已尝试按照此处的建议将 blob 传递给 shiny:https://shiny.rstudio.com/articles/communicating-with-js.html

Shiny.setInputValue("videoObject", video.blob)

我还尝试将它作为表单的一部分传递给 shiny:

var formData = new FormData();
    formData.append('video', video.blob);
    Shiny.setInputValue("videoObject", formData)

但是,到目前为止,我既无法访问 Shiny 中的 videoObject,也无法将其保存到应用程序目录中。

我还尝试按照此处 https://ourcodeworld.com/articles/read/671/how-to-record-a-video-with-audio-in-the-browser-with-javascript-webrtc and here Local store video webRTC 的建议在 PHP 中编写解决方案。但是,执行 PHP 脚本 returns 出现“400 错误请求错误”。我以前从未使用过 PHP,所以很有可能我做错了什么,或者 PHP 一开始就无法在 Shiny 服务器上运行。

如有任何关于

的信息,我将不胜感激

我找到了答案:

在JavaScript

  1. 使用 URL.getDataURL() 函数(基于 https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL)将视频 blob 转换为 base 64 编码字符串。

代码:

recorder.getDataURL(function(dataURL) {
        video.data = dataURL;
    });
  1. 将该数据传递给 Shiny 在 JavaScript 中初始化的 Shiny.onInputChange 变量。

代码:

var formData = {id:123, data: video.data}
Shiny.onInputChange("videoobject", formData)

在 R / 闪亮

  1. 删除 data:/;base64, 添加的 JavaScript 前缀。
  2. 从 base_64 转换回二进制。
  3. 在服务器上存储二进制文件。

代码:

observeEvent(input$videoobject,{
     data <- input$videoobject$data
     writeBin(jsonlite::base64_dec(substr(data,24,nchar(data))), "www/test_video.webm")
    })