如何在 Java 中保存 MJPEG 流中的图片?我想调用一个 HTTP MJPEG 地址并将每一帧保存到一个单独的图片文件中。
问问题
8895 次
5 回答
3
VLCj 应该能够播放该流。如果您只想经常保存屏幕截图,您应该能够使用DirectMediaPlayer(它会给您一个 BufferedImage)然后使用 ImageIO 来保存它。
请注意,它不是世界上最容易使用的 API,并且需要本地代码;如果您是初学者(从问题看来您可能是?)那么这不是最简单的任务!
于 2011-08-06T11:28:16.123 回答
2
于 2011-11-16T05:25:05.317 回答
1
我在 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.
于 2013-08-16T13:02:58.343 回答
0
请参阅几年前发布的http://wiki.bitplan.com/index.php/MJpegStreamer 。
该项目中有多个实现。这是一个例子:
package com.bitplan.mjpegstreamer;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.util.logging.Level;
import com.bitplan.mjpegstreamer.ViewerSetting.DebugMode;
/**
* Alternative MJpegRunner implementation
* http://code.google.com/p/ipcapture/source/browse/IPCapture.java?r=0d
* f4452208266f77fdc09b427682eaee09054fcb for an alternative implementation
* Copyright (c) 2014 Wolfgang Fahl
*
*/
public class MJpegReaderRunner2 extends MJpegRunnerBase {
private ByteArrayOutputStream jpgOut;
public final static String VERSION = "0.1.1";
/**
* no args default constructor
*/
public MJpegReaderRunner2() {
}
@Override
public void init(InputStream inputStream) throws IOException {
this.curFrame = new byte[0];
this.frameAvailable = false;
if (inputStream != null)
this.inputStream = new BufferedInputStream(inputStream);
// if (debug)
// debugTrace("init called");
}
/**
* stop reading
*/
public synchronized void stop(String msg) {
try {
if (jpgOut != null)
jpgOut.close();
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
handle("Error closing streams: ", e);
}
DebugMode debugMode = DebugMode.None;
if (viewer != null)
debugMode = viewer.getViewerSetting().debugMode;
if ((debugMode == DebugMode.Verbose) && (conn!=null))
LOGGER
.log(Level.INFO, "stopping connection " + conn.getClass().getName());
if (conn instanceof HttpURLConnection) {
HttpURLConnection httpcon = (HttpURLConnection) conn;
if (debugMode == DebugMode.Verbose)
LOGGER.log(Level.INFO, "disconnecting " + this.getUrlString());
httpcon.disconnect();
}
if (debugMode == DebugMode.Verbose)
debugTrace("stop with msg: " + msg, this);
super.stop(msg);
}
/**
* run me
*/
public void run() {
connect();
if (!connected)
throw new IllegalStateException(
"connection lost immediately after connect");
int prev = 0;
int cur = 0;
try {
// EOF is -1
readloop: while (connected && (inputStream != null)
&& ((cur = inputStream.read()) >= 0)) {
if (prev == 0xFF && cur == 0xD8) {
jpgOut = new ByteArrayOutputStream(INPUT_BUFFER_SIZE);
jpgOut.write((byte) prev);
}
if (jpgOut != null) {
jpgOut.write((byte) cur);
if (prev == 0xFF && cur == 0xD9) {
synchronized (curFrame) {
curFrame = jpgOut.toByteArray();
}
frameAvailable = true;
jpgOut.close();
// the image is now available - read it and check if we reached the
// limit
// e.g. maxFrameCount
connected = read();
// LOGGER.log(Level.INFO,this.getTimeMsg());
if (!connected) {
break readloop;
}
}
}
prev = cur;
}
// end of input stream reached
String msg = "end of inputstream " + this.getTimeMsg();
if (viewer!=null)
msg+=" read time out is set at "+viewer.getViewerSetting().readTimeOut+" msecs";
stop(msg);
} catch (IOException e) {
handle("I/O Error " + this.getTimeMsg() + ":", e);
}
}
}
于 2020-01-23T05:59:18.020 回答
-1
您可以只解析 Jpeg 字节并将它们保存到文件中。
于 2011-08-25T10:52:35.007 回答