Android用のJavaCVを利用しようとしています。スクリーンショットで構成されるビデオ ストリームを作成したいと思います。FFmpegFrameRecorder を使用してファイルを書き込めることがわかりましたが、ストリーム、配列、バッファなど、ファイル以外には書き込めません。
次に、'avio_alloc_context' と read/write/seek コールバックを使用するカスタム 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 でカスタムの読み取り/書き込みを初期化する正しい方法を知っていますか?