Сохраняйте / экспортируйте веб-видео в каталог приложений из JavaScript в Shiny

Я интегрировал захват видео с веб-камеры в приложение Shiny, используя RecordRTC и JavaScript. Это прекрасно работает, и я могу получить доступ к своим видео и хранить их в переменной JavaScript с именем «video.blob». Тем не менее, я борюсь с экспортом этого файла в блестящий каталог моего приложения при нажатии кнопки «btn-save-recording».

Я попытался передать блоб блестящему, как это предлагается здесь: https://shiny.rstudio.com/articles/communicating-with-js.html

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

Я также попытался передать его блестящему как часть формы:

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

Однако до сих пор мне не удалось ни получить доступ к видеообъекту в Shiny, ни сохранить его в каталоге приложения.

Я также попытался закодировать решение на PHP, как предлагается здесь https://ourcodeworld.com/articles/read/671/how-to-record-a-video-with-audio-in-the-browser-with-javascript-webrtc и здесь Local store video webRTC. Однако выполнение скрипта PHP возвращает «400 Bad Request Error». Я никогда раньше не использовал PHP, так что есть большая вероятность, что я сделал что-то не так или PHP вообще не работает на сервере Shiny.

Буду очень признателен за любую информацию о

  • Как сохранить веб-видео в каталог моего приложения из JavaScript на Shiny
  • Как передать веб-видео из JavaScript в Shiny, чтобы я мог работать с ним с такими библиотеками, как opencv, imager или av.
  • В случае, если нет простого способа выполнить вышеуказанное, я был бы признателен за некоторые советы о том, какой тип другого сервера я должен запустить, чтобы он мог получать мои веб-видео, отправленные с JavaScript.

person Phil    schedule 26.01.2020    source источник


Ответы (1)


Я нашел ответ:

В JavaScript

  1. Преобразуйте большой двоичный объект видео в строку, закодированную с основанием 64, с помощью функции URL.getDataURL() (на основе https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL).

Код:

recorder.getDataURL(function(dataURL) {
        video.data = dataURL;
    });
  1. Передайте эти данные в переменную Shiny.onInputChange, которую Shiny инициализирует в JavaScript.

Код:

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

В R / Shiny

  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")
    })
person Phil    schedule 07.02.2020