Извините за повторяющуюся тему, но я искал и экспериментировал в течение 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", ничего не сработало.Я что-то пропустил?Я делаю это слишком сложным?Причина моей реализации в том, что мне нужен новый поток для каждого полного изображения, верно?
Большое спасибо!