我正在尝试将 JavaCV 用于 android。我想创建一个由屏幕截图组成的视频流。我发现我可以使用 FFmpegFrameRecorder 写入文件,但除了文件之外,我无法写入流、数组、缓冲区或其他任何内容。
接下来是我发现了一段代码,其中包含使用“avio_alloc_context”和读/写/搜索回调的自定义 FrameRecorder。不幸的是,它只是一个片段,它是在 C++ 中的。android 上的 'avio_alloc_context' 方法采用 Read_packet、Read_packet 和 Seek 回调,因此我无法传递 Write_packet 回调。此外,在“avio_alloc_context”调用之后,我对传递给“avio_alloc_context”的所有对象都调用了“finalize”。
final VideoOutputStream videoOutputStream = new VideoOutputStream(stream);
Read_packet read_packet = new Read_packet() {
@Override
public int call(Pointer arg0, BytePointer arg1, int arg2) {
VideoOutputStream videoStream = (VideoOutputStream) arg0;
try {
videoStream.write(arg1.getStringBytes());
} catch (IOException e) {
e.printStackTrace();
}
return arg2;
}
};
AVIOContext pb = avio_alloc_context(new MBytePointer(av_malloc(video_outbuf_size)), video_outbuf_size, 1,videoOutputStream, null, read_packet, null);
oc.pb(pb);
使用上面的代码不会崩溃也不会报告错误。我只是不断收到空文件。
我的问题是——你们中有人设法让它工作吗?你知道在 JavaCV 的 FrameRecorder/Grabber 中初始化自定义读/写的正确方法吗?