2017-03-22 8 views
1

私は絶望的です。私はたくさんのことを試みました。助けてください名前付きLinuxパイプからの読み込みBufferedInputStreamは一度しか動作しません

背景のビット: ラズベリーパイ3を使用して、私は利用可能なものを望んでいないので、ウェブカメラストリーミングサーバーを開発します。 raspistillではfpsが非常に低く(4fps)、ウェブカメラをストリーミングするためのv4l2オプションを検討しています。このために、mjpegビデオをパイプに出力します。

このパイプから読み取ると、最初のJPEG画像が表示されますが、連続読み取りはnullを返します。

これをさらに調べるために、私は小さなデモプログラムを作成しました - 同じ結果。ここで

私が使用するコード:(いくつかのSystem.outで強化)BufferedInputStreamを

からの読み取り

反復処理を20回

private void standardRead() { BufferedInputStream bis = null; try { bis = new BufferedInputStream(new FileInputStream(new File(image_path))); } catch (FileNotFoundException e) { e.printStackTrace(); } System.out.println("Is mark supported? "+bis.markSupported()); try { for(int i=0;i<20;i++) { readingImage(bis,i); TimeUnit.MILLISECONDS.sleep(250); } } catch (IOException | InterruptedException e) { e.printStackTrace(); } } 

Readメソッド

private void readingImage(BufferedInputStream bis,int iteration) throws IOException 
    { 
     System.out.println("Available bytes to read:"+bis.available()); 
     System.out.println("Reading image"+iteration); 

     BufferedImage read = ImageIO.read(bis); 

     if(read!=null){ 
      System.out.println(read.getRGB(25, 25)+" h:"+read.getHeight());System.out.println(); 
     }else 
     { 
      System.out.println("image is null"); 
     } 
     read = null; 
    } 

私にすでに試してみました: - 新しいBufferedInpuの作成各反復 ためのTStreamに - 閉会と新しいBufferedInputStreamを を作成 - (運)のマークを使用してみましたんやリセット - 使用してストリームからの読み取りImageIOにするのではなく、読んで(約20FPSで、これまで明らかにするために読み込み)

私は実行v4l2はフレームが消費されたことを通知します。したがって、パイプはJavaプログラムによって空にされているため、新しいフレームをパイプに挿入することができます。 最初の画像だけがプログラムの最初の実行中に私に1つの画像を返します。プログラムの2回目の実行は、最初のイメージにもnullを与えます。ここで

出力例:

Is mark supported? true 
Available bytes to read:65536 
Reading image0 
image is null 
Available bytes to read:73720 
Reading image1 
image is null 
Available bytes to read:73712 
Reading image2 
image is null 
Available bytes to read:73704 
Reading image3 
image is null 
Available bytes to read:73696 
Reading image4 
image is null 
Available bytes to read:73688 
Reading image5 
image is null 

ワンノート、任意の役に立つ場合。 ImageIO.read(InputStream)関数の場合、Javaのdocは私が理解できない不思議なことを述べています。

(...)InputStreamはImageInputStreamでラップされています。何 登録されたImageReaderが、結果のストリームを読み取ることができると主張していない場合は、 ヌルは、(...)あなたの助けやアドバイスを事前に

感謝を返されます。

+1

でテストされたいくつかの画像形式は、暗黙的を持っていませんImageIOは* InputStream全体を読み込みます。 PNGはそのような形式の1つです。 – VGR

答えて

1

眠れない1晩後、私は何か働いている。

ユーレカ:v4l2ライブラリを使用して1000フレームをlinuxパイプにストリームし、1000フレームすべてを読み込むことができます。各ファイルをディレクトリに保存すると、約10秒間で約103秒かかります。単一のフレームはスキップされません。

private void ReadImages(File path) 
    { 
     BufferedInputStream bis = null; 
     int index = 0; 

     ImageReader reader = null; 

      try { 
       bis = new BufferedInputStream(new FileInputStream(path)); 
       ImageInputStream stream = ImageIO.createImageInputStream(bis); 

       while(bis.available()>0) 
       { 
        if(gotReader(stream)) 
        { 
         reader = ImageIO.getImageReaders(stream).next(); 
         reader.setInput(stream); 
         BufferedImage read = reader.read(index); 
         System.out.println("Image height"+read.getHeight() +" image width:"+read.getWidth()) ; 

         stream.flush();     
        index = 0; 
        } 

       } 
      } catch (IOException e) { 
       System.err.println(e.getMessage()); 
       //e.printStackTrace(); 
      } 
    } 

ヒント:頻繁にストリームをフラッシュし、インデックスをリセットここ

はどのようにあります。成長しているメモリをフラッシュしなければ、性能が劇的に損なわれる。

ヒント:標準ImageIOにはBGR3、RGB3、YU12、YUYV、YV12、YVYUが、H264およびMJPEGを読んでいないが

ヒント:Readerが

if(ImageIO.getImageReaders(stream).hasNext()) 
+0

私はあなたがそれを働かせてうれしいです。 –

関連する問題