1


我正在尝试从 MJPEG 流中捕获图像(jpeg)。
根据本教程http://www.walking-productions.com/notslop/2010/04/20/motion-jpeg-in-flash-and-java/ 我应该只保存从 Content-Length 开始的日期:并结束于——我的边界。
但由于某种原因,当我打开保存的文件时,我收到此消息无法打开此图片,因为文件似乎已损坏、损坏或太大。

public class MJPEGParser{

    public static void main(String[] args){
        new MJPEGParser("http://192.168.0.100/video4.mjpg");
    }

    public MJPEGParser(String mjpeg_url){
        try{

            URL url = new URL(mjpeg_url);
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
            String line;
            while((line = in.readLine()) != null){
                System.out.println(line);
                if(line.contains("Content-Length:")){
                    BufferedWriter out = new BufferedWriter(new FileWriter("out.jpeg"));
                    String content = in.readLine();
                    while(!content.contains("--myboundary")){
                        out.write(content);
                        System.out.println(content);
                        content = in.readLine();

                    }
                    out.close();
                    in.close();
                    System.exit(0);
                }
            }

            in.close();

        }catch(Exception e){
            e.printStackTrace();
        }
      }
}

我将非常感谢任何提示。

4

2 回答 2

1

有很多事情可能会导致您的代码失败:

  • 并非所有MJPEG流都以您的教程建议的类似 MIME 的方式编码。
    引用维基百科

    […] 没有文档定义了一种被普遍认为是“Motion JPEG”的完整规范,可在所有情况下使用的精确格式。

    例如,可以使用 MJPEG 作为AVI(即RIFF)文件的视频编解码器。因此,请确保您的输入文件采用教程描述的格式。

  • 文本--myboundary几乎可以肯定是一个占位符。在典型的多部分 MIME 消息中,全局 MIME 标头将提供一个boundary属性,指示实际用于分隔部分的字符串。您必须添加到--那里给出的字符串。
  • 当您使用ReaderandWriter时,您正在对字符而不是字节进行操作。根据您的语言环境,这两者之间可能没有 1:1 的对应关系,从而破坏了过程中数据的二进制格式。您应该对字节流进行操作,或者明确使用某些字符编码,例如 ISO-8859-1,它确实具有这样的 1:1 对应关系。
于 2012-09-25T14:16:47.773 回答
0

我最近试图解决这个问题,我的谷歌研究多次把我带到这里。我最终解决了这个问题。关键部分是使用BufferedInputStreamandFileOutputStream读取和写入 jpeg 字节,同时还将字节缓冲区连接成一个字符串以读取和识别帧之间的标题:

int inputLine;
String s="";
byte[] buf = new byte[1]; //reading byte by byte 

URL url = new URL("http://127.0.0.1:8080/?action=stream");
BufferedInputStream in = new BufferedInputStream(url.openStream());
OutputStream out = new FileOutputStream("output.jpg");
        
while ((inputLine = in.read(buf)) != -1) {
 
    s= s+ new String(buf, 0, inputLine);

    if (s.contains("boundarydonotcross")){
        System.out.println("Found a new header");
        s="";
    }

如果有人需要,完整的代码在这里:

https://github.com/BabelCoding/MJPEG-to-JPG

于 2021-04-03T15:54:28.600 回答