我正在尝试使用此代码从网络摄像头的 MJPEG 流中读取图像帧序列,主要遵循
MultipartStream
顶部的示例用法 javadoc:
public static void main(String[] args) {
try {
HttpURLConnection conn = (HttpURLConnection) new URL("http://....").openConnection();
conn.setRequestMethod("GET");
conn.connect();
if (conn.getResponseCode() != 200)
throw new RuntimeException("Failed to connect: " + conn.getResponseCode());
String ct = conn.getHeaderField("Content-Type");
String bnd = "--" + ct.split("boundary=")[1];
System.out.println("Boundary is: " + bnd);
try (InputStream is = conn.getInputStream()) {
MultipartStream multi = new MultipartStream(is, bnd.getBytes(StandardCharsets.ISO_8859_1), 4096, null);
boolean next = multi.skipPreamble(); // STUCK HERE
while (next) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
multi.readBodyData(baos);
processFrame(baos);
next = multi.readBoundary();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
Chrome 似乎能够成功渲染流,所以我不相信它是无效的流。 它卡在
multi.skipPreamble()
处。 我认为,在内部,它只是无休止地消耗源InputStream
,而没有找到边界。 不确定我做错了什么。 我尝试将传入流转储到文件中并查看该文件,但在我未经训练的眼睛看来,它看起来没问题:
然后在第一帧的末尾我可以看到这个:
正如预期的那样,这会重复。
多部分中间的另一个 200 ok(+4 标头)对于多部分来说是不正常的。该网络摄像头的作用更像是一个 http 响应管道。
skipPreamble() 意图应该跳过这些标头,并且不会检测“--myboundary”,因为缺少“--”。
然而,MultipartStream 的来源似乎暂时忽略了所需的“--”。我认为您发现了不那么合法的数据暴露的弱点。不确定他们会修复它。
您应该尝试单步执行此代码,看看它是否错误地从意外重复的 4 个标头中获取了重复的boundary=myboundary。