Я пытаюсь создать простое приложение, которое будет передавать потоковое видео с камеры с помощью браузера на удаленный сервер. Для доступа к камере из браузера я нашел замечательный WebRTC API: getUserMedia
.
Теперь для потоковой передачи на сервер IIU C лучшим способом было бы использовать некоторые из WebRTC_API
для транспортировки и затем используйте некоторую библиотеку на стороне сервера, чтобы справиться с этим.
Однако сначала я использовал немного другой подход: у меня есть пользователь MediaRecorder
, основанный на потоке с камеры. И затем я установил временной интервал для MediaRecorder.start()
равным нескольким сотням мс, например 200. И у меня были некоторые предположения относительно MediaRecorder
, которые не совпадают c с тем, что я наблюдал:
Я наблюдал странное поведение (по сравнению с моими предположениями о MediaRecorder
):
- Если на сервер был загружен только 1 блок -> он открывается просто отлично.
- Если есть несколько блоков -> ни один из них не загружается правильно, они выдают ошибки:
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
и почему они существуют.