如何用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

如何在Java中保存MJPEG流中的图片?
我想调用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,你知道如何从流中接收数据吗?我会从那里开始。