Демультиплексирование потоковых данных (webm)
Существуют ли готовые решения для демультиплексирования потоковых данных (webm)? Смотрел в сторону библиотеки libwebm, но, похоже, что она больше подходит для работы с файлами, нежели с потоковыми данными.
Данный вопрос возник в контексте разработки десктопного приложения на базе Electron, которое используется для получения видео с мобильных устройств по протоколу WebRTC с последующим декодированием и передачей полученных данных кастомного драйверу (с помощью аддона, написанного на C++).
Более детально:
- При добавлении нового трека мы извлекаем из него MediaStream и передаем его в конструктор MediaRecorder'а.
- Запускаем MediaRecorder, указывая ненулевое значение для параметра timeslice.
- Когда очередная порция данных готова, мы передаем их в аддон, который с помощью libwebm должен демультиплексировать потоковые данные на аудио и видео, декодировать их, и отправить в соответствующий драйвер.
Сейчас для демультиплексирования используется libwebm (с небольшими изменениями), происходит это следующим образом:
- читаем EBML заголовок контейнера (webm)
- создаем сегмент, инициализируем, делаем load (но без загрузки кластеров, см. определение
Segment::Load) - загружаем очередной кластер, в случае успеха перебираем блоки, извлекаем видео фреймы и аудио данные, передаем их соответствующим декодерам, в противном случае - ждем новой порции данных
Все ломается после того, как возникает необходимость перезаписать буфер - когда очередная порция данных не может быть записана [в буфер], "остаток" необработанных данных копируется в начало буфера, затем запиcь продолжается в обычном режиме. Если я правильно понимаю суть проблемы, то все дело в том, что сегмент хранит различные позиции и отступы (что приемлемо, когда речь идет о файлах), которые становятся невалидными после того, как происходит очередная перезапись буфера.
Возможно, кто-то уже занимался чем-то подобным и сможет предложить решение или другой вариант того, как это можно реализовать.
P.S. Если у кого-то есть опыт разработки WebRTC-приложений с помощью нативного API - буду весьма признателен, если поделитесь ссылками\проектами. Лично меня данный вариант отпугнул объемами кода chromium/webrtc и способом, которым это все собирается :)