効率的な解決策を考えるのに少し苦労しています。私が予見しているいくつかの問題があります。最初のものは...
OOM 防止
過去 30 秒または 5 分が必要な場合は実行可能ですが、過去 30 分または 1 時間、あるいはすべてが必要な場合はどうすればよいでしょうか? バイトバッファを保持するということは、それを RAM に格納することを意味します。100 メガバイトを超えるデータを格納することは、仮想メモリの自殺のように聞こえます。
では、以前に記録されたメディアの Y 時間 (たとえば 30 秒) を tmp ファイルでディスクに保存するとどうなるでしょうか。それは潜在的に機能する可能性があり、mp4パーサーのようなライブラリを使用して、終了時にすべてを連結できます。でも...
30 分の価値がある場合、30 秒のクリップが約 60 個あります。これは、SD カードを焼き尽くすのに最適な方法のように思えます。それが問題ではないとしても、100 以上のファイルを 1 つに連結するのに必要な時間は想像できません。
私が調査してきたことから、ローカルソケットを使用して次のようなことをすることを考えていました...
MediaRecorder -> setOutputFile(LocalSocket.getFD())
次に、ローカルソケットで...
LocalSocket -> FileOutputStream -> write(data, position, bufsiz) -> flush()
バックグラウンド スレッドが位置とバッファの書き込みと追跡を処理する場所。
これは純粋に疑似コードであり、これをテストするにはまだ十分ではありません。これで正しい方向に進んでいますか? 私が考えていることから、これは上書きされるファイルを1つだけ保持します。Y 秒に 1 回しか書き込まれないため、IO オーバーヘッドが最小限に抑えられ、消費する RAM の量も最小限に抑えられます。
ビデオの長さからバッファ サイズ
要求されたビデオ サイズからバッファのサイズを取得するにはどうすればよいですか。長い動画は小さいのに短い動画は巨大な動画がいくつかあるので、不思議です。したがって、これを正確に判断する方法がわかりません。Media Recorder から設定されるビデオの長さ、エンコードなどを知っていれば、これを予測する方法を知っている人はいますか?
例
誰かがこれの例を知っていますか? アイデアが完全に独創的だとは思いませんが、それらの多くは世の中に見られず、そうであればクローズド ソースです。例は大いに役立ちます。
前もって感謝します