我已经使用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 中
- 使用 URL.getDataURL(( 函数(基于 https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL(将视频 blob 转换为 base 64 编码字符串。
法典:
recorder.getDataURL(function(dataURL) {
video.data = dataURL;
});
- 将该数据传递给 Shiny 在 JavaScript 中初始化的 Shiny.onInputChange 变量。
法典:
var formData = {id:123, data: video.data}
Shiny.onInputChange("videoobject", formData)
在R/闪亮
- 删除数据:/;base64,JavaScript添加的前缀。
- 从base_64转换回二进制。
- 将二进制文件存储在服务器上。
法典:
observeEvent(input$videoobject,{
data <- input$videoobject$data
writeBin(jsonlite::base64_dec(substr(data,24,nchar(data))), "www/test_video.webm")
})