MediaRecorder API чанки как самостоятельное видео - PullRequest
1 голос
/ 20 апреля 2020

Я пытаюсь создать простое приложение, которое будет передавать потоковое видео с камеры с помощью браузера на удаленный сервер. Для доступа к камере из браузера я нашел замечательный WebRTC API: getUserMedia.

Теперь для потоковой передачи на сервер IIU C лучшим способом было бы использовать некоторые из WebRTC_API для транспортировки и затем используйте некоторую библиотеку на стороне сервера, чтобы справиться с этим.

Однако сначала я использовал немного другой подход: у меня есть пользователь MediaRecorder, основанный на потоке с камеры. И затем я установил временной интервал для MediaRecorder.start() равным нескольким сотням мс, например 200. И у меня были некоторые предположения относительно MediaRecorder, которые не совпадают c с тем, что я наблюдал:

Я наблюдал странное поведение (по сравнению с моими предположениями о MediaRecorder):

  1. Если на сервер был загружен только 1 блок -> он открывается просто отлично.
  2. Если есть несколько блоков -> ни один из них не загружается правильно, они выдают ошибки: Could not determine type of stream. Но тогда, если я использую ffmpeg для объединения всех кусков - результирующий файл в порядке. То же самое происходит, если я объединяю blobs из MediaRecorder.ondataavailable на клиенте.

Таким образом, вопрос:

Могут ли куски теоретически быть независимые видео файлы? Или это не то, для чего MediaRecorder был разработан? Если это не так - тогда почему у нас даже есть возможность указать параметр timeslice в его методе start()?

Бонусный вопрос

Если мы установка timeslice сравнительно небольшая, например, 10 мс -> множество больших двоичных объектов данных, которые отправляются на MediaRecorder.ondataavailable, имеют размер 0. Где мы можем найти какие-то гарантии / спецификации на минимальном timeslice, который мы можем использовать, так что Значения больших двоичных объектов данных?

В документации есть следующее:

Если временной интервал не определен, то после сбора минимальных миллисекунд данных временного среза или некоторых минимальный временной интервал, налагаемый UA, в зависимости от того, что больше, начинает сбор данных в новый BLOB-объект и ставит в очередь задачу, используя источник задачи DOM-манипуляции, который запускает событие BLOB-объекта с именем dataavailable на устройстве записи с BLOB-объектом.

Итак, я предполагаю, что это как-то связано с тем, что некоторые двоичные объекты данных имеют размер 0. Что означает «некоторый минимальный интервал времени, наложенный UA»?

PS

Рад предоставить код, если это необходимо. Но вопрос не в каком-то конкретном c коде. Это для того, чтобы понять предположения, стоящие за MediaRecorder API и почему они существуют.

1 Ответ

1 голос
/ 20 апреля 2020

Параметр timeslice не позволяет создавать независимые медиа-чанки; вместо этого он дает возможность сохранять данные (например, в файловой системе или загружать их на сервер) на регулярной основе, а не хранить потенциально большой медиа-контент в памяти.

...