0

FrameRecorder を使用して Web カメラからビデオをキャプチャするために JavaCV を使用しています。

私は webCam ビデオを「avi」ビデオ InputStream として提供するライブラリ ユーティリティ クラスの作成に取り組んでいます。ここでは、FrameRecorder がそのような機能を提供していないため、これを行うことができません。必要なのはファイル名だけであり、ファイルシステム上のビデオ。FrameRecorder から Java InputStream を生成するにはどうすればよいですか?

参照用のサンプル コードは次のとおりです。

FrameGrabber frameGrabber = FrameGrabber.createDefault(1);
frameGrabber.start();
IplImage grabbedImage = frameGrabber.grab();
int width = grabbedImage.width();
int height = grabbedImage.height();

FrameRecorder frameRecorder = new FFmpegFrameRecorder("c:\\output.avi", width, height);
frameRecorder.setAudioChannels(frameGrabber.getAudioChannels());
frameRecorder.start();        

int i = 0;
while ((grabbedImage = frameGrabber.grab()) != null && i <= 500) {
    frameRecorder.record(grabbedImage);
    i++;
}

frameRecorder.stop();
frameGrabber.stop();

私は他の選択肢も受け入れています...

前もって感謝します

アシッシュ

4

2 に答える 2

1

動画ファイルを作成することが目的ではないのに、なぜ を使用するのFrameRecorderですか?

私が考えることができる最も実用的な解決策は、バックエンドとして単純に拡張InputStreamすることです。FrameGrabberJavaCV はそれをそのままでは提供しないように思われるので、残念ながら自分でそれを行う必要があります。

のドキュメントでInputStream説明されているように、 のサブクラスはInputStreamのみを実装するpublic abstract int read()必要がありますが、他のメソッドも上書きする必要があることに注意してください。

を実装することをお勧めしますpublic int read(byte[] b)

参考までに、非常に単純で非効率的で安全でない実装を以下に示します。

警告はテストされていません!

public int read(byte[] data) throws IOException, BufferUnderflowException, Exception {

    IplImage grabbedImage = frameGrabber.grab();
    if(grabbedImage == null)
        throw <some IOException here>
    grabbedImage.getByteBuffer().get(data);
    return data.length;
}
于 2013-09-17T22:11:12.003 に答える
1

http://code.google.com/p/javacv/source/browse/src/main/java/com/googlecode/javacv/cpp/avformat.javaによると

フレームデータを書き込むために呼び出されるメソッドは次のようです。

/**
* Write a packet to an output media file.
*
* The packet shall contain one audio or video frame.
* The packet must be correctly interleaved according to the container
* specification, if not then av_interleaved_write_frame must be used.
*
* @param s media file handle
* @param pkt The packet, which contains the stream_index, buf/buf_size,
* dts/pts, ...
* This can be NULL (at any time, not just at the end), in
* order to immediately flush data buffered within the muxer,
* for muxers that buffer up data internally before writing it
* to the output.
* @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush
*/
public static native int av_write_frame(AVFormatContext s, AVPacket pkt);

ネイティブの方法として、ファイル以外のネイティブ lib 出力をリダイレクトするか、返された画像データを使用して AVI を「ビルド」することをお勧めします。

メモリ マップド ファイルを使用することもできますが、その場合、ビデオの連続キャプチャが必要な場合は、良い考えではないと思います。

于 2013-09-17T17:55:21.810 に答える