私は絶望的です。私はたくさんのことを試みました。助けてください名前付き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が、結果のストリームを読み取ることができると主張していない場合は、 ヌルは、(...)あなたの助けやアドバイスを事前に
感謝を返されます。
でテストされたいくつかの画像形式は、暗黙的を持っていませんImageIOは* InputStream全体を読み込みます。 PNGはそのような形式の1つです。 – VGR