Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NodeJS没有正确反转Base64?_Python_Node.js_Base64_Mjpeg_Picamera - Fatal编程技术网

Python NodeJS没有正确反转Base64?

Python NodeJS没有正确反转Base64?,python,node.js,base64,mjpeg,picamera,Python,Node.js,Base64,Mjpeg,Picamera,我想使用PiCamera在一个安全摄像头般的设置中传输视频,首先使用MJPEG。我设法从Raspberry Pi站点获得了一个演示服务器。我让它以多种方式工作,使用标记、背景图像、更多的HTTP头、更少的HTTP头。但是,我不想在服务器上使用Python,我想使用node 我找不到一个与PiCamera等效的节点不使用Python。因此,我决定将每个图像转换为Base64,并将其发布到stdout,然后使用child\u进程接受节点中的输出。我可能会考虑一些类似于IPC或Seeljs。似乎没有办

我想使用PiCamera在一个安全摄像头般的设置中传输视频,首先使用MJPEG。我设法从Raspberry Pi站点获得了一个演示服务器。我让它以多种方式工作,使用
标记、背景图像、更多的HTTP头、更少的HTTP头。但是,我不想在服务器上使用Python,我想使用node

我找不到一个与PiCamera等效的节点不使用Python。因此,我决定将每个图像转换为Base64,并将其发布到
stdout
,然后使用
child\u进程
接受节点中的输出。我可能会考虑一些类似于IPC或Seeljs。似乎没有办法将图像作为Base64发送<代码>内容类型不接受“base64”字符集,HTTP不支持
内容传输编码
。因此,需要将图像转换回二进制文件,以便沿线路发送。实际响应应该与Python演示服务器非常相同

我可以将图像从Python发送到节点,它们似乎与Python演示服务器中的图像相同。很难相互比较图像,但是前两个字节和后两个字节看起来是一样的。但是,流不会显示在节点服务器的HTML中。它是白色的,当我直接将MJPEG URL放入浏览器时,整个页面是黑色的,出于某种原因,通常中间只有“ht”。我检查了两台服务器上的标题,没有发现任何错误。我注意到节点硬编码为HTTP 1.1,而Python默认使用HTTP 1.0,我了解到1.1需要更改
连接
&
保持活动
头,但我将Python服务器更改为HTTP 1.1,一切都继续工作

这两台服务器上的图像内容与我训练有素的眼睛非常相似。我无法复制二进制文件,但当反转时,它与原始的base64相同。将单个base64图像复制到数据URL中会生成有效图像。那么,还会发生什么呢

节点服务器:

const frameStart='/9j/';
const{url}=import.meta;
const{pathname:_filename}=新URL(URL);
从“child_进程”导入{spawn};
从“流”导入{PassThrough};
从“路径”导入{extname};
从“http”导入{createServer};
从膝关节炎中导入膝关节炎;
从“koa路由”导入路由器;
从“粉笔”导入粉笔;
const{get:getRoute,post:postRoute}=路由器;
常量{绿色、灰色、洋红、青色}=白垩;
const server=new Koa();
const html='picamera MJPEG流媒体演示'+
'' +
“.实时图像{”+
'背景图像:url(/live.mjpeg);'+
'宽度:640px;'+
'高度:480px;'+
'}' +
'' +
“PiCamera MJPEG流媒体演示”+
'';
server.liveStream=new PassThrough();
use({response:res},next)=>{
res.set('服务器','');
next();
})
.use(getRoute('/',({response:res})=>{
赋值(res,{status:200,body:html});
}))
.use(postRoute('/start live'),({app,res})=>{
res.status=200;
惊吓(app);
}))
.use({app,method,path,res},next)=>{
if(方法!='GET'| | extname(path)!='.mjpeg'){
返回next();
}
res.body=newpassthrough();
惊吓(app);
res.status=200;
res.type='multipart/x-mixed-replace;boundary=FRAME';
res.set('Cache-Control','no-store');
res.remove(“保持活力”);
res.remove(“连接”);
res.remove(“传输编码”);
const typeHeader='Content-Type:image/jpeg';
app.liveStream.on('data',bufData64=>{
const data64=bufData64.toString();
const binData=Buffer.from(data64,'base64').toString('latin1');
const lengthHeader=`Content Length:${binData.Length}`;
push(`--FRAME\n${typeHeader}\n${lengthHeader}\n\n${binData}\n`);
});
});
导出默认服务器;
if(process.argv[1]==\u文件名){
听();
}
导出异步函数listen(){
const-app=createServer({},server.callback());
app.listen(3000);
控制台日志(绿色(青色('BFeeder'),
“在港口服务”,格雷(3000));
}
功能启动(服务器){
const{liveStream}=server;
返回新承诺(解决=>{
设frame='';
const{stdout}=spawn('./photo_rpi.py');
stdout.on('data',out=>{
out=out.toString();
const[first,…parties]=out.split(frameStart);
const last=parties.pop();
帧+=第一帧;
if(框架和(件数.长度| |最后一个)){
liveStream.push(frame);
帧='';
}
用于(对象的常数[索引,条数]。条目(条数)){
帧+=`${frameStart}${piece}`;
if(索引<件数.长度-1){
liveStream.push(frame);
帧='';
}
}
帧=帧| |帧开始;
帧+=(最后一帧);
});
once('data',()=>resolve());
});
}
函数noop(){
//故意空函数
}
Python视频创建者和演示服务器:

#/usr/bin/env蟒蛇3
html=('picamera MJPEG流媒体
演示'+
''+'.实时图像{'+
'背景图像:url(/live.mjpeg);'+
'宽度:640px;'+
'高度:480px;'+
'}' +
'' +
“PiCamera MJPEG流媒体演示”+“”)
从io导入字节io
从线程导入条件
从sys import argv、stdout from picamera从time导入picamera从argparse导入sleep从base64导入ArgumentParser导入b64encode
从http导入服务器
parser=ArgumentParser()
parser.add_参数('--serve','-s',action='store_true'))
[服务]=vars(parser.parse_args()).values()
摄像机=PiCamera(分辨率=640x480',帧速率=24)
类StdoutStreamer():
def写入(自身、原始):
buf=B64编码(原始)
img=buf.decode()
标准写入(img)
类Ser