Android: запись и потоковая передача одновременно

Это на самом деле не столько вопрос, сколько презентация всех моих попыток решить одну из самых сложных функций, с которыми мне приходилось сталкиваться.

я используюlibstreaming библиотека для потоковой передачи видео в реальном времениWowza Server и мне нужно записать его одновременно на SD-карту. Ниже я представляю все мои попытки собрать новые идеи у сообщества.

Скопируйте байты из потока libstreaming в файл mp4

развитие

Мы создали перехват в библиотеке libstreaming для копирования всех отправленных байтов в файл mp4. Libstreaming отправляет байты на сервер Wowza через LocalSocket. Он использует MediaRecorder для доступа к камере и микрофону устройства и устанавливает выходной файл в качестве входного потока LocalSocket. Что мы делаем, это создаем обертку вокруг этого входного потока, выходящего из InputStream, и создаем поток вывода File внутри него. Таким образом, каждый раз, когда libstreaming выполняет чтение над входным потоком LocaSocket, мы копируем все данные в выходной поток, пытаясь создать действительный файл MP4.

препятствие

Когда мы пытались прочитать файл, он поврежден. Мы поняли, что в файле MP4 отсутствует метаинформация. В частности, атом Moov. Мы попытались отложить закрытие потоковой передачи, чтобы дать время для отправки этого заголовка (это все еще было предположение), но это не сработало. Чтобы проверить согласованность этих данных, мы использовали платное программное обеспечение, чтобы попытаться восстановить видео, включая заголовок. Это стало играбельным, но это был в основном зеленый экран. Так что это стало не заслуживающим доверия решением. Мы также попытались использовать «untrunc», бесплатную программу командной строки с открытым исходным кодом, и она даже не смогла начать восстановление, так как атома moov не было.

Используйте ffmpeg, скомпилированный для Android, чтобы получить доступ к камере

развитие

FFMPEG имеет плагин Gradle с Java-интерфейсом для использования в приложениях Android. Мы подумали, что можем получить доступ к камере через командную строку (она, вероятно, находится в "/ dev / video0") и отправили ее на медиа-сервер.

препятствие

Мы получили сообщение об ошибке «Отказано в доступе» при попытке доступа к камере. Обходной путь может заключаться в том, чтобы получить root-доступ к устройству, но это лишит телефоны гарантии и может привести к их повреждению.

Используйте ffmpeg, скомпилированный для Android в сочетании с MediaRecorder

развитие

Мы попытались сделать поток FFMPEG файлом mp4, записываемым внутри телефона через MediaRecorder.

препятствие

FFMPEG не может передавать потоковые файлы MP4, которые еще не сделаны с записью.

Используйте ffmpeg, скомпилированный для Android с libstreaming

развитие

Libstreaming использует LocalServerSocket в качестве соединения между приложением и сервером, поэтому мы подумали, что мы можем использовать ffmpeg, связанный с локальным адресом LocalServerSocket, для копирования потоковой передачи непосредственно в локальный файл на SD-карте. Сразу после начала потоковой передачи мы также запустили команду ffmpeg, чтобы начать запись данных в файл. Используя ffmpeg, мы полагали, что он создаст файл MP4 надлежащим образом, что означает, что с включенным заголовком атома moov.

препятствие

Созданный «адрес» не читается через командную строку, как локальный адрес внутри телефона. Так что копия не возможна.

Используйте OpenCV

развитие

OpenCV - это кроссплатформенная библиотека с открытым исходным кодом, предоставляющая строительные блоки для экспериментов и приложений с компьютерным зрением. Он предлагает высокоуровневые интерфейсы для захвата, обработки и представления данных изображения. У него есть свои собственные API для соединения с камерой устройства, поэтому мы начали изучать его, чтобы увидеть, есть ли у него необходимые функции для потоковой передачи и записи одновременно.

препятствие

Мы обнаружили, что библиотека на самом деле не предназначена для этого, а скорее как математическое манипулирование изображением. Мы получили даже рекомендацию использовать libstreaming (что мы уже делаем).

Используйте Kickflip SDK

развитие

Kickflip - это сервис потоковой передачи мультимедиа, который предоставляет собственный SDK для разработки под Android и IOS. Он также использует HLS вместо RTMP, который является более новым протоколом.

препятствие

Их SDK требует, чтобы мы создали Activity с видом с камеры, которая занимает весь экран устройства, что нарушает удобство использования нашего приложения.

Используйте Adobe Air

развитие

Мы начали консультироваться с другими разработчиками приложений, уже доступных в Play Store, которые уже транслируются на серверы.

препятствие

Связавшись с этими разработчиками, они заверили, что невозможно будет одновременно записывать и транслировать с использованием этой технологии. Более того, нам пришлось бы переделывать все приложение с нуля, используя Adobe Air.

ОБНОВИТЬWebRTC

развитие

Мы начали использовать WebRTC следующиеэтот великий проект, Мы включили сигнальный сервер в наш сервер NODEJS и начали делать стандартное рукопожатие через сокет. Мы все еще переключались между локальной записью и передачей через webrtc.

препятствие

Webrtc работает не в каждой конфигурации сети. Кроме этого, получение камеры - это весь нативный код, что значительно усложняет попытку скопировать байты или перехватить его.

Ответы на вопрос(0)

Ваш ответ на вопрос