Следующий код загружается моим основным app.js как модуль с использованием метода child_process.fork():
var spawn = require('child_process').spawn;
var ffmpeg = spawn('C:\\Program Files (x86)\\ffmpeg\\bin\\ffmpeg.exe', ['-y', '-threads', '-0', '-re', '-rtbufsize', '204800000', '-probesize', '4096', '-vsync', '2', '-async', '30', '-f', 'dshow', '-s', '320x240', '-i', 'video=Integrated Webcam:audio=Microphone Array (IDT High Defi', '-c:a', 'libvo_aacenc', '-ab', '48000', '-ar', '22050', '-ac', '2', '-c:v', 'libx264', '-s', '400x300', '-g', '96', '-x264opts', 'bitrate=1200', '-preset', 'ultrafast', '-profile:v', 'baseline', '-pix_fmt', 'yuv420p', '-aspect', '4:3', '-f', 'flv', 'rtmp://server']);
setTimeout(function() {
ffmpeg.stderr.on('data', function() {
ffmpeg.stdin.setEncoding('utf8');
ffmpeg.stdin.write('q');
process.exit();
});
}, 10000);
Это было гораздо менее сложно, чем я делал. Основной app.js — это базовая HTML-страница, которая обслуживается и использует socket.io для получения события и соответствующих данных. В этом случае «истинное» событие загружает файл module.js, который запускает сеанс захвата FFMPEG в реальном времени, передает его на сервер RTMP и корректно завершает работу FFMPEG по тайм-ауту в 10 секунд.
Моя следующая задача — выключить его через событие, инициированное из веб-интерфейса, в отличие от текущего метода тестирования тайм-аута.
Глядя на диспетчер задач в Windows, процесс FFMPEG закрывается, как и процесс вторичного узла.
Причина этого в том, что ни один из модулей node-ffmpeg, которые я нашел, не поддерживает прямую трансляцию через ввод захвата. Похоже, они в первую очередь предназначены для перекодирования существующего контента. Конечным результатом этого в идеале будет веб-интерфейс, который может запускать и останавливать FFMPEG. Наш вариант использования заменит Adobe Flash Media Live Encoder в качестве источника для нашего Adobe Media Server из-за его невозможности сохранять стандартные файлы mp4.
person
RickZ
schedule
10.01.2013