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属性を提供し、パーツを区切るために実際に使用される文字列を示します。--そこに指定された文字列の前に追加する必要があります。
  • Readerandを使用Writerしているため、バイトではなく文字を操作しています。ロケールによっては、これら 2 つの間に 1 対 1 の対応がない場合があり、処理中にデータのバイナリ形式が壊れます。バイト ストリームを操作するか、ISO-8859-1 のような 1:1 対応の文字エンコーディングを明示的に使用する必要があります
于 2012-09-25T14:16:47.773 に答える
0

私は最近この問題を解決しようとしていましたが、Google の調査で何度もここにたどり着きました。私は最終的に問題を解決しました。重要な部分は、BufferedInputStreamおよびを使用しFileOutputStreamて 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 に答える