如何用Java保存MJPEG流中的图片?
如何在Java中保存MJPEG流中的图片?如何用Java保存MJPEG流中的图片?,java,http,video,stream,mjpeg,Java,Http,Video,Stream,Mjpeg,如何在Java中保存MJPEG流中的图片? 我想调用HTTP MJPEG地址并将每一帧保存到一个单独的图片文件。VLCj应该能够播放该流。如果你想经常保存屏幕截图,你应该能够使用它来给你一个BuffereImage,然后使用ImageIO来保存它 请注意,虽然它不是世界上最容易使用的API,并且需要本机代码;如果你是一个初学者,从问题来看,你可能是?那么这不是最简单的任务 您只需解析出Jpeg字节并将其保存到文件中即可 下面是一段代码,可以帮助您: 我的流服务器运行在linux上,我使用wget
我想调用HTTP MJPEG地址并将每一帧保存到一个单独的图片文件。VLCj应该能够播放该流。如果你想经常保存屏幕截图,你应该能够使用它来给你一个BuffereImage,然后使用ImageIO来保存它
请注意,虽然它不是世界上最容易使用的API,并且需要本机代码;如果你是一个初学者,从问题来看,你可能是?那么这不是最简单的任务 您只需解析出Jpeg字节并将其保存到文件中即可 下面是一段代码,可以帮助您:
我的流服务器运行在linux上,我使用wget命令记录
sudo wget -O ./outputfile.mjpg XXX.XXX.XXX.XXX:port
然后使用将outputfile.mjpg转换为outputfile.mp4
ffmpeg -r 1/5 -i outputfile.mjpg outputfile.mp4.
看看几年前出版的
该项目中有多个实现。以下是一个例子:
包com.bitplan.mjpegstreamer;
导入java.io.BufferedInputStream;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.net.HttpURLConnection;
导入java.util.logging.Level;
导入com.bitplan.mjpegstreamer.ViewerSetting.DebugMode;
/**
*替代的MJpegRunner实现
* http://code.google.com/p/ipcapture/source/browse/IPCapture.java?r=0d
*F4452208266F77FDC09B427682EEE09054FCB,用于替代实施
*版权c 2014 Wolfgang Fahl
*
*/
公共类MJpegReaderRunner2扩展了MJpegRunnerBase{
私人ByteArrayOutputStream jpgOut;
公共最终静态字符串版本=0.1.1;
/**
*没有参数默认构造函数
*/
公共MJpegReaderRunner2{
}
@凌驾
public void initInputStream inputStream引发IOException{
this.curFrame=新字节[0];
this.frameAvailable=false;
如果inputStream!=null
this.inputStream=新的BufferedInputStreaminputStream;
//如果调试
//调用debugTraceinit;
}
/**
*停止阅读
*/
公共同步无效停止字符串消息{
试一试{
如果jpgOut!=null
jpgOut.close;
如果inputStream!=null{
inputStream.close;
}
}捕捉异常{
关闭流的句柄错误:,e;
}
DebugMode DebugMode=DebugMode.None;
如果查看器!=null
debugMode=viewer.getviewerset.debugMode;
如果debugMode==debugMode.Verbose&&conn!=null
记录器
.logLevel.INFO,正在停止连接+conn.getClass.getName;
如果连接HttpURLConnection的实例{
HttpURLConnection httpcon=HttpURLConnection conn;
如果debugMode==debugMode.Verbose
LOGGER.logLevel.INFO,断开+this.getUrlString;
httpcon.disconnect;
}
如果debugMode==debugMode.Verbose
带有msg:+msg的debugTracestop,此;
super.stopmsg;
}
/**
*跑我
*/
公开募捐{
连接
如果!已连接
抛出新的非法状态异常
连接后立即失去连接;
int prev=0;
int cur=0;
试一试{
//EOF为-1
readloop:连接时&&inputStream!=null
&&cur=inputStream.read>=0{
如果prev==0xFF&&cur==0xD8{
jpgOut=新的ByteArrayOutputStreamINPUT\u缓冲区大小;
jpgOut.writebyte-prev;
}
如果jpgOut!=null{
jpgOut.writebyte cur;
如果prev==0xFF&&cur==0xD9{
同步帧{
curFrame=jpgOut.toByteArray;
}
frameAvailable=true;
jpgOut.close;
//图像现在可用-阅读它并检查我们是否到达
//极限
//例如,maxFrameCount
连接=读取;
//LOGGER.logLevel.INFO,this.getTimeMsg;
如果!已连接{
中断读循环;
}
}
}
prev=cur;
}
//已到达输入流的结尾
String msg=inputstream的末尾+this.getTimeMsg;
如果查看器!=null
msg+=读取超时设置为+viewer.getViewerSetting.readTimeOut+ms;
stopmsg;
}捕捉异常{
handleI/O错误+this.getTimeMsg+:,e;
}
}
}
您需要编写一些Java代码来接收MJPEG帧并将其写入文件。也许你应该更具体地说明你遇到了什么问题
嘿,谢谢你,我不知道怎样才能收到这些帧并把它们保存到磁盘上。你能给我一个方法吗?Favi,你知道如何从流中接收数据吗?我会从那里开始。