Я пытаюсь скомпилировать ffmpeg в javascript, чтобы я мог декодировать видеопотоки H.264, используя node. Потоки представляют собой кадры H.264, упакованные в RTP NALU, поэтому любое решение должно иметь возможность принимать кадры H.264, а не целое имя файла. Эти кадры не могут быть в контейнере, таком как MP4 или AVI, потому что тогда демультиплексору требуется отметка времени каждого кадра, прежде чем может произойти демультиплексирование, но я имею дело с потоком в реальном времени, без контейнеров.
Потоковая передача H.264 по RTP
Ниже приведен базовый код, который я использую для прослушивания сокета udp. Внутри обратного вызова «сообщение» пакет данных представляет собой дейтаграмму RTP. Часть данных граммы данных представляет собой кадр H.264 (P-кадры и I-кадры).
var PORT = 33333;
var HOST = '127.0.0.1';
var dgram = require('dgram');
var server = dgram.createSocket('udp4');
server.on('listening', function () {
var address = server.address();
console.log('UDP Server listening on ' + address.address + ":" + address.port);
});
server.on('message', function (message, remote) {
console.log(remote.address + ':' + remote.port +' - ' + message);
frame = parse_rtp(message);
rgb_frame = some_library.decode_h264(frame); // This is what I need.
});
server.bind(PORT, HOST);
Я нашел библиотеку Broadway.js, но не смог заставить ее работать, и она не обрабатывает P-кадры, которые мне нужны. Я также нашел ffmpeg.js, но смог заставить его работать, и для этого нужен целый файл, а не поток. Аналогично, fluent-ffmpeg не поддерживает файловые потоки; все примеры показывают, что конструктору передается имя файла. Поэтому я решил написать свой собственный API.
Моя текущая попытка решения
Мне удалось скомпилировать ffmpeg в один большой файл js, но я не могу использовать его таким образом. Я хочу написать API вокруг ffmpeg, а затем предоставить эти функции для JS. Итак, мне кажется, что мне нужно сделать следующее:
- Скомпилируйте компоненты ffmpeg (avcodec, avutil и т. д.) в битовый код llvm.
- Напишите оболочку C, которая предоставляет функциональность декодирования и использует EMSCRIPTEN_KEEPALIVE.
- Используйте emcc, чтобы скомпилировать оболочку и связать ее с битовым кодом, созданным на шаге 1.
Я нашел WASM+ffmpeg, но он на китайском, и некоторые шаги непонятны. . В частности, есть этот шаг:
emcc web.c process.c ../lib/libavformat.bc ../lib/libavcodec.bc ../lib/libswscale.bc ../lib/libswresample.bc ../lib/libavutil.bc \
:( Где, я думаю, я застрял
Я не понимаю, как все компоненты ffmpeg компилируются в отдельные файлы *.bc. Я следовал командам emmake из этой статьи и получил один большой файл .bc.
2 вопроса
1. Кто-нибудь знает шаги по компиляции ffmpeg с использованием emscripten, чтобы я мог открыть некоторые API для javascript?
2. Есть ли лучший способ (с достойной документацией/примерами) для декодирования видеопотоков h264 с помощью узла?