非同期タイトル見ても何のこっちゃよくわかんない?(^_^;)まえがき諸般の事情でしばらく寝かせてた記事を公開することにしました(^_^)vAndroidで動画を生成保存するには、大きく分けて2つの方法があります。APIを使う方法です。MediaRecorder使う方法はネット上にも沢山資料が公開されているのでそちらをどうぞ。APIを使う方法はMediaRecorderに比べると資料が少ないですが、このブログでも以前紹介させていただきました。ここらへんの記事になります。APIを使うメリットはあまりありません。APIを使うならではのメリットの1つ・・・ようするにMediaRecorderでは出来ない事の1つを今回から数回に分けて紹介します。MediaRecorderでは、API>=11でMediaRecorder#setCaptureRateメソッドが追加され、映像取り込み時の回数(フレームレート)を遅くすることが出来るようになりました。要はタイムラプス的な録画が出来るようになったってことなのですが、残念なことに1秒間に数フレームぐらいまでしかフレームレートを遅くすることが出来ません。遅くしたい、数分〜数時間毎に映像を取り込んで1つの動画ファイルにまとめたい。そんな事を考えたことのある人も居るとは思いますが、簡単には実現できません。間欠的に撮影した動画を最終的に1つのファイルとして出力出来るようにする。APIを使う方法では、一度録画を停止すると追加して保存するなんてことは簡単には出来ません。́)!!1回の撮影あたりのフレーム数を1フレームだけ限定せず間欠的に任意のフレーム数をとりこめるような仕様とする。これはまぁ例えば画面にタッチしている間だけ録画して最終的に1つのファイルに出力したいなぁってことです。純粋なタイムラプス動画を作成するためだけに作ったわけではないです。途中でアプリが終了されても大丈夫にする。サービスとして実装する方法もあるのですが、例えば何時間かに1度しか動かないのに、アプリが常駐して動き続けてるあるいはリソースを使ってるなんてのは、リソースの限られたAndroid機にとっては良くないですよね。実行するなんて機能は含んでないです。タイマーでもサービスでも使って好きなタイミングを作って下さい。APIを使って録音や録画をする場合には、普通はMediaCodecクラスを使ってエンコードした後そのデータをMediaMuxerクラスでファイルに書き込むと言う処理を行います。FFmpeg信者ならMediaMuxerの代わりにFFmpeg使うことも出来ます。間が空くような間欠撮影だとそんなもったいないこと出来ません。言うかいつ電話がかかってきてバックグランドへ回されたりローメモリーになってkillされてしまうかわからないスマホ/タブレットのアプリで長時間無駄にインスタンスを保ち続けるのはダメですよね。MediaMuxerクラスには既に存在している動画ファイルに追記していくような機能はありませんので、一旦終了してから何時間後かに新しいフレームを追加していくなんてことは出来ないのです。一般的な動画ファイルフォーマット、例えばMP4とかでは内部にビットレートや画像サイズ、コーデックの種類等のメタデータ、映像トラックデータ、音声トラックデータ等を含み、ボックスと呼ばれる(規格によってはコンテナやチャンク、アトム、フレームなどとも呼ばれる)バイナリブロックが連なった構造をしています。そのために単純に映像データや音声データをフレーム毎に追記していくだけでは正しい動画フォーマットにならないのです。自分で動画ファイルの内部データを直接書き換えるようなクラスを作るとか、一旦再生(デコード自体は不要)しながらMediaMuxerへ出力して元動画のデータが無くなったとこから新しいフレームを追加していくとか、FFmpeg使うとかすればばもちろん出来るのですが・・・じゃあどうすんねんじゃぁどうすんねんというと、いくつか実装方法は考えつくと思いますが、今回はアプリが終了しても大丈夫なようにするためにオレオレフォーマットの中間ファイルを生成して、順次追記して最後に1つの動画ファイルにまとめるって方法にしました。ようは、MediaCodecでのエンコード処理と、MediaMuxerでの動画ファイルへの出力処理を別々に分けてしまえってことですね。一般の動画ファイルでは誰が再生するかわからないので様々な情報を特定の形式で保存する必要がありますが、中間ファイルは自分しか読み書きしないので好きなように書き込むことが出来ます。ちなみに今回の実装とは違いますが、純粋にタイムラプス動画を作るだけ・・・例えば定期的に1フレームだけ保存(ようはコマ撮り)するのであれば各フレームを静止画として保存しておいて、後からMediaCodecへ書き込んでエンコード&MediaMuxerでファイル出力するって方が簡単です。again.って書いてあります。