Сохранение / экспорт видео webm в каталог приложений из JavaScript в Shiny - PullRequest
0 голосов
/ 26 января 2020

Я интегрировал захват видео с веб-камеры в приложение Shiny, используя RecordRT C и 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 webRT C. Однако выполнение сценария PHP возвращает «Ошибка 400 неверных запросов». Я никогда раньше не использовал PHP, поэтому есть большая вероятность, что я сделал что-то не так, или PHP не работает на блестящем сервере.

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

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

1 Ответ

0 голосов
/ 07 февраля 2020

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

В JavaScript

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

Код:

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

Код:

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

В R / Shiny

  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")
    })
...