很抱歉有一个重复的话题,但我现在已经搜索和试验了2天,但我还没有能够解决问题。
我尝试使用以下代码通过socket.io-stream每隔1秒向客户端直播图片:
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
设置很好,进程成功写入stdout。我使用这个简化的代码捕获所有传出的图像数据:
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);
});
&#34;插座&#34;来自客户端使用socket.io-package,没问题。所以我正在做的是我在stdout-pipe上听取&#34;数据&#34;事件。该数据将传递给上面的函数。这意味着在这个阶段&#34;数据&#34;不是一个流,它是一个&#34; <Buffer .. .. ..
&#34; -object,因此我无法像之前使用注释的createReadStream语句一样流式传输它,我从磁盘读取图像。 如何将数据(此阶段的缓冲区)流式传输到客户端?我可以这样做,也许不使用socket.io-stream?&#34;数据&#34;只是整个图像的一部分,因此可能需要将两个或三个数据对象组合在一起以形成完整的图像。
我尝试使用&#34; stream.write(数据,&#34;二进制&#34;);&#34;它确实传输了Buffer-objects,问题是没有stream-event的结束,因此我不知道图像何时完成。我尝试注册到stdout.on&#34;关闭&#34;,&#34;结束&#34;,&#34;完成&#34;,没有任何触发器。我错过了什么吗?我是否过于复杂?我实现背后的原因是我需要为每个完整的图像创建一个新的流,是吗?
非常感谢!