Труба между двумя дочерними процессами в Node.js?

Я пытаюсь захватить видео с помощью FFmpeg с Node.js и отправить его в браузер через веб-сокеты для воспроизведения с помощью MediaSource API. То, что у меня есть, работает в Firefox, но неправильно декодируется в Chrome. Очевидно, что после прочтения этого вопроса мне нужно использовать программу sample_muxer, чтобы каждый кластер начинался с ключевого кадра.

Вот код, который я использую:

var ffmpeg = child_process.spawn("ffmpeg",[
    "-y",
    "-r", "30",

    "-f","dshow",           
    "-i","video=FFsource:audio=Stereo Mix (Realtek High Definition Audio)",

    "-vcodec", "libvpx",
    "-acodec", "libvorbis",

    "-threads", "0",

    "-b:v", "3300k",
    "-keyint_min", "150",
    "-g", "150",

    "-f", "webm",

    "-" // Output to STDOUT
]);

ffmpeg.stdout.on('data', function(data) {
    //socket.send(data); // Just sending the FFmpeg clusters works with Firefox's 
                         // implementation of the MediaSource API. No joy with Chrome.

    // - - - This is the part that doesn't work - - -
    var muxer = child_process.spawn("sample_muxer",[
        "-i", data, // This isn't correct...

        "-o", "-" // Output to STDOUT
    ]);

    muxer.stdout.on('data', function(muxdata) {
        socket.send(muxdata); // Send the cluster
    });
});

ffmpeg.stderr.on('data', function (data) {
    console.log("" + data); // Output to console
});

Очевидно, что я не правильно об этом говорю, и я не уверен, как бы я это сделал, в то же время приводя аргументы. Ценю любую помощь, чтобы это работало. Спасибо!

1 ответ

Решение

Программа sample_muxer принимает аргумент -i в качестве имени файла. Он не может читать видеоданные как стандартный ввод. Чтобы просмотреть ошибку, вы должны отправить поток ошибок из sample_muxer в файл журнала ошибок.

var muxer = child_process.spawn("sample_muxer",[
    "-i", data, // This isn't correct...
    "-o", "-" // Output to STDOUT
]);

Этот код приведет к ошибке на https://code.google.com/p/webm/source/browse/sample_muxer.cpp?repo=libwebm#240

Вы можете попробовать записать файл из ffmpeg и затем прочитать этот файл из sample_muxer. Как только это сработает, попробуйте с файлом FIFO передать данные из ffmpeg в sample_muxer.

Другие вопросы по тегам