実際には再開できずIllegalStateException例外を生成します。AOSPのコードを見ると、#stopを呼び出すとINITIALIZEDステート/UNINITIALIZEDステート(生成した直後と同じ状態)になっていました。一方で#startを呼び出すには、CONFIGUREDステート(#configureが正常終了した状態)になっている必要があるのです。現在のMediaCodecの実装で者#stopと#reset(API>=21)は実質的には同じになっているってことです。́●)と言う事で、#stopを呼び出した後は#configureからやり直さないとだめっです。どおせぇってちゅうねん。APIとしては再利用出来ると謳っているにも関わらず、#stopと#resetは実質的には同じ実装になってるってとこからしても実際には再利用は真剣にサポートする気の無い機能なのかもしれないですね。今回の実装では再利用はキッパリ諦めてreleaseしてしまうことにします。その代わりといってはなんですが、今回の実装ではあまり短周期でのresume/pauseは不得意です。1〜数秒以上の間隔が開いているような場合がメインターゲットです。1秒に数フレーム以上保存したいのであれば普通にMediaRecorderとかMediaCodecを使って下さい。ちなみに表向きは4ステートほどですが、実際のMediaCodec内では中間ステートも含めて11ステート定義されてあります。Developersを見てもMediaRecorderやMediaPlayerには状態遷移図があるのにMediaCodecには無いんだろうなぁきっと(-_-;)今度こそコードをと思ったけどやっぱり先にオレオレ中間ファイルの構造にしよう(^_^;)ファイルの先頭から、ヘッダー、フォーマット、実際のフレームデータが並びます。ヘッダーコーデックの初期化データ。MediaCodecの初期化に使用したMediaFormatをUTF文字列にシリアライズしたもの。同じ条件で初期化したMediaCodecでないと1つの動画ファイルにまとめることが難しいので、初回初期化時に保存しておいて、2回目以降のMediaCodec初期化にも同じMediaFormatを使えるようにします。コーデックからの出力フォーマットデータ。MediaCodec#getOutputFormatで取得したMediaFormatをUTF文字列にシリアライズしたもの。csd-2が必要になります(PPSとかが入ってます)。MediaCodec初期化用のMediaFormatと同じでこれも同じでないと困るので初回取得時に保存しています。フレームデータフレームデータ...ヘッダーは次の64バイトにしています。32ビット符号付き整数resumeする度にインクリメントしています。64ビット符号付き整数System#nanoTimeで取得した各フレーム保存時の時刻です。32ビット符号付き整数。40バイト(32ビット整数で5つ分)フレームデータはサイズ不定なので各フレーム毎に全てヘッダーをつけてその後に実際のビットストリームを書き込みます。映像または音声のビットストリーム作り始めはresumeの度に1つづつファイルを生成してましたが、最終的には1つのファイルに追記するだけにしました。映像用と音声用は別ファイルです。1つのファイルに追記していくんならシーケンス番号なんていらないんじゃないのって思うかもしれませんが、フレーム時刻を補正する際に必要です。シーケンス番号の変わり目でresume/pauseしたということなので、そこを起点にフレーム時刻をオフセットさせます。せずにもし単純にフレーム時刻をそのまま動画の各フレームの時刻にしてしまうと、仮にフレーム間が1時間空いていれば1時間もの間同じ映像が変わらず表示されてしまいます。シーケンス番号とフレーム番号をどちらか1個にまとめるのは出来ますけど最初の頃の名残&将来への備えと言う事で残しています。予約領域の40バイトも同じ理由ですが所詮はオレホレフォーマットなので辻褄さえ合わせていれば削除しても増やしてもOKですよ。今度こそ今度こそコードをと言ってもMediaCodec周りはいつもと変わらないんだよなぁ・・・後回しにしよう(^_^;)代わりに中間ファイルから動画を生成する方をまず載せましょう。null);}}}実行内容は簡単で次の4つです。普通にMediaMuxerを初期化します。音声と映像のそれぞれの中間ファルを開きます。MediaCodecから#getOutPutFormatで出力フォーマットを取得する代わりにファイルから読み込んだ出力フォーマットを使って#addTrackします。後は音声・映像それぞれの中間ファイルからフレーム毎にデータを読み込んでMediaMuxerへ書き込んでいくのを繰り返す作り始めた時はもしかすると音声と映像の時刻を自前で同期しながら書き込まないとダメかもって思ってましたが、気にせずに順に書き込んでいって大丈夫でした。前に書いたとおり音声・映像それぞれでresume/pasueした時の時刻補正だけはしておかないとダメです。最初はresume/pause毎にファイルを生成したので面倒でしたが、ファイルを1つにしてからは意外とすんなり出来てしまって拍子抜けでした。すると普通にMediaCodecでエンコードしながらMediaMuxerへ書き込んでいくよりも簡単かもしれないです。言う事で今回はおしまい。サンプルプロジェクトは近いうちにGitHubへ上げま〜す。概要については以前の記事を参照して下さい。reserved.%d人のブロガーが「いいね」をつけました。このサイトでは利便性の向上の為に、機能的なクッキーと外部スクリプトを使用しています。同意しますプライバシー設定広告プライバシー設定このサイトでは利便性の向上の為に、機能的なクッキーと外部スクリプトを使用しています。どのクッキーとスクリプトが使用され、どのように訪問に影響を与えるかを左に示します。設定はいつでも変更できます。あなたの選択はサイトへの訪問に悪い影響を与えません。これらの設定は、現在使用しているブラウザとデバイスにのみ適用されます。広告このサイトでは、サイトや広告を改善するためにCookieを利用することがあります。本サイトを利用することでCookieの仕様に同意するものとします。