Node.js, потоковый канал выводит данные на клиент с сокетом io-stream - PullRequest
0 голосов
/ 22 мая 2018

Извините за повторяющуюся тему, но я искал и экспериментировал в течение 2 дней и не смог решить проблему.

Я пытаюсь транслировать потоковые изображения каждую 1 секунду вклиент через socket.io-stream, используя следующий код:

var args = [
    "-i",
    "/dev/video0",
    "-s",
    "1280x720",
    "-qscale",
    1,
    "-vf",
    "fps=1",
    config.imagePath,
    "-s",
    config.imageStream.resolution[0],
    "-f",
    "image2pipe",
    "-qscale",
    1,
    "-vf",
    "fps=1",
    "pipe:1"
];
camera = spawn("avconv", args);    // avconv = ffmpeg

Настройки хороши, и процесс успешно записывает в стандартный вывод.Я собираю все исходящие данные изображения, используя этот упрощенный код:

var ss = require("socket.io-stream");
camera.stdout.on("data", function(data) {
    var stream = ss.createStream();
    ss(socket).emit("img", stream, "newImg");
    // how do i write the data-object to the stream?
    // fs.createReadStream(imagePath).pipe(stream);
});

"socket" приходит от клиента с помощью socket.io-пакета, никаких проблем там нет.Итак, что я делаю, так это то, что я слушаю stdout-pipe для события «data».Эти данные передаются в функцию выше.Это означает, что на данном этапе «данные» не являются потоком, это «<Buffer .. .. ..» - объект, и поэтому я не могу передавать его так, как я мог бы ранее использовать закомментированный оператор createReadStream, где я читаю образ с диска. Как передать поток данных (буфер на данном этапе) клиенту?Могу ли я сделать это по-другому, возможно, не используя socket.io-stream? «данные» - это только одна часть целого изображения, поэтому, возможно, два или три объекта «данных» должны быть объединены для формирования полного изображения,

Я попытался использовать "stream.write (data," binary ");"который передал объекты Buffer, проблема в том, что нет конца потокового события, и поэтому я не знаю, когда изображение завершено.Я попытался зарегистрироваться на stdout.on "close", "end", "finish", ничего не сработало.Я что-то пропустил?Я делаю это слишком сложным?Причина моей реализации в том, что мне нужен новый поток для каждого полного изображения, верно?

Большое спасибо!

...