我正在使用 JavaCV 使用 FrameRecorder 从我的网络摄像头捕获视频。
我正在努力创建一个库实用程序类,它将提供网络摄像头视频作为“avi”视频输入流,在这里我无法这样做,因为 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();
我也对任何其他替代方案持开放态度......
提前致谢
阿什什
最佳答案
根据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);
作为其 native 方法,您的赌注将是重定向 native lib 输出而不是文件, 或使用返回的图像数据“构建”您的 AVI。
您可以使用内存映射文件,但在这种情况下您想要连续捕获视频,我认为这不是一个好主意。
关于java - 无法从 javaCV FrameRecorder 类创建 java InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18698509/