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



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

我试图按照这里的建议将斑点传递给闪亮: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,也无法将其保存到应用程序目录中。

我还尝试用PHP编写解决方案,如此处建议 https://ourcodeworld.com/articles/read/671/how-to-record-a-video-with-audio-in-the-browser-with-javascript-webrtc 和此处本地存储视频webRTC。但是,执行 PHP 脚本会返回"400 错误请求错误"。我以前从未使用过PHP,所以很有可能我做错了什么,或者PHP首先无法在Shiny服务器上运行。

我将不胜感激任何有关以下方面的信息

  • 如何将 webm 视频从 JavaScript 在 Shiny 上保存到我的应用程序目录
  • 如何将webm视频从JavaScript传递到Shiny,以便我可以将其与opencv,imager或av等库一起使用。
  • 如果没有简单的方法来完成上述工作,我将不胜感激,因为我应该启动哪种类型的其他服务器,这些服务器能够接收从 JavaScript 发送的 webm 视频。

我找到了一个答案:

在 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. 删除数据:/;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")
})

最新更新