LINUX.ORG.RU

ElectronJS, запись и конвертирование в mp3 в real-time

 , , ,


0

2

Задача

Получать поток данных с микрофона, конвертировать на лету в mp3 формат и передавать на сервер. Цифровой аналог рации.

Используется

  • ElectronJS (ver. 6.0.10);
  • fluent-ffmpeg (ver. 2.1.2)
  • ffmpeg (ver. 4.2-static)

Комментарий

Сейчас используется следующий алгоритм: В renderer процессе через navigator.getUserMedia инициализируется микрофон и получаем поток. Поток скармливается MediaRecorder. Когда приходит команда начать запись, данные собираются в blob, blob скармливается FileReader, чтобы получить base64 строку. Полученный результат передаётся через IPC из renderer процесса в main. В main процессе данные сохраняются во временный файл. Временный файл скармливается ffmpeg, который в виде выходного файла некий url адрес конечного файла, куда производится запись/передача. Это одинаково работает, и в Windows системе, и в Linux системах.

Сейчас требуется real-time реализация, чтобы данные конвертировались в mp3 и передавались в процессе записи.

Что пробовал:

  • Скармливать данные из MediaRecorder в ffmpeg через Stream API. Мысль такова: Пока «активен» поток, ffmpeg конвертирует и передаёт данные в real-time режиме. Поток закрываем, конвертирование останавливается, в файл записывается окончание. Через remote.require подключил ffmpeg в renderer процессе. Создал сквозной Transform поток, который входящие данные трансформировал в Blob’ы. Поток скармливался ffmpeg. Аналогично действующему решению, только данные передаются сразу в ffmpeg. ffmpeg ругается на входные данные, это странно, потому что такие же данные записываются во временный файл. Ещё не разобрался в причинах такого поведения.

  • Передавать в ffmpeg адрес микрофона. Мысль такова: ffmpeg всеяден и может самостоятельно брать поток данных с микрофона. ElectronJS будет только управлять командами «старт», «стоп» и предоставлять конечный url. Здесь всплывает пласт проблем, связанных с поиском и объявлением аудио устройств.

Вопросы

Какие ещё можно рассмотреть доступные варианты, что мог упустить из виду или сделать неправильно?

Найденное мною решение:

Событие dataavailable в MediaRecorder выдаёт Blob. Этот Blob можно конвертировать в Buffer элемент через пакет blob-to-buffer. Далее, полученный буфер можно скормить ffmpeg’у напрямую или через IPC протокол.

ffmpeg запускаю через функцию spawn модуля child_process в NodeJS и скармливаю буфер командой:

ffmpeg.stdin.write(data);

После записи всех данных, закрываю поток:

ffmpeg.stdin.end()
Adeptus-Mechanicus ()

Я не понимаю, чего все так бухтят на электрон и ноду.

Современный настольный нативный гуй в глубокой жопе: он зачастую не кроссплатформеннен, он никак не развивается, на каждой платформе выглядит чуть-чуть по разному и т.д.

С электроном же все супер: тонны практик разработки и поддержки сложных приложений. Кроссплатформенно. В 99% работает с гпушным ускорением. Имеется возможность гибко подстраиваться под размер окна. В электрон легко оборачивается серверное приложение, особенно, если оно написано на ноде. Это так же работает и в обратном направлении. Например, есть проект, который vscode запускает как сервер и у тебя есть доступ к ide через любой браузер.

Какая альтернативная технология позволяет сделать тоже самое? Я вообще не вижу смысла начинать сейчас разрабатывать гуишное приложение не на электроне. Рано или поздно понадобится веб версия. Или придется изучать того же монстра, как qt, при этом менее гибкого, со всеми проблемами плюсов, в виде трудноотлавливаемых ub, медленной скорости разработки, дизайнеров, которые не понимают, что сделать чуть-чуть нестандартный список - целая проблема и т.п.

anonymous ()

в mp3 формат
Цифровой аналог рации.
Какие ещё можно рассмотреть доступные варианты

ffmpeg последних версий может при подключении либы

codec2
, всё остальное (mp3, aac, vorbis,...) - баловство.

anonymous ()
Ответ на: комментарий от LamerOk

Ну, современная жизнь без полноценного браузера все равно невозможна. Так что минимальным параметрам приложений для электрона так или иначе соответсвуют все компьютеры (а с теми компьютерами, у которых 128Мб оперативы, все равно не до современных приложений, ms word 2003 работает - уже хорошо).

Остается еще вопрос объема приложения. Но уж 70-80Мб оверхеда тоже мало кто заметит.

anonymous ()

Какие ещё можно рассмотреть доступные варианты, что мог упустить из виду или сделать неправильно?

Пока главная твоя ошибка - начать что-то писать. Бери готовое или озвучивай настоящую задачу.

t184256 ★★★★★ ()

Бери готовое

Какие есть готовые варианты?

озвучивай настоящую задачу

ElectronJS, real-time, mp3, сохранение на сервере. На каком этапе обман?

Adeptus-Mechanicus ()