お久しぶりー(^o^)/ちょっと忙しくてなかなか更新できへんかった。そうこうしている内に一気に涼しくなって今年も残り2ヶ月弱。頑張りませうp(^_^)q
それはともかく表題の件、ファイル丸ごとコピーじゃないよ。PC上でも無くてAndroid上です。
H.263とかH.264で映像をエンコードしてあるMP4ファイルの内の動画(とできれば音声)をコピーする方法を調べてみました。より正確には動画ファイルの一部分を指定してコピーする方法ですね。
MP4の規格とその元となっているQuickTimeの規格、H.264関係の規格などを眺めてみた結果、映像については任意の一部分を取り出して保存するには再エンコード無しでは難しい感じです。
正確には、再エンコード無しでも任意の一部分を取り出して保存すること自体はできるものの、先頭にキーフレームが無ければかなり乱れた画像になってしまうみたいでした。
H.264等の圧縮率の高い動画エンコード方式は、1フレーム毎の圧縮だけではなく時間軸方向での圧縮もされていて、それ以外のフレームは1つ前のフレームからの差分のような状態になっているみたいです(正確には規格を読んでね)。なので、キーフレーム(=単独のフレームデータだけで映像を復号できるフレーム)が無ければ差分値だけとなってしまうので、変化の大きい部分しか復号できない=乱れた映像になる、ということらしいです。
こんな記事もありました。
[Android Tips] mp4parser を使って動画ファイルを編集する
mp4parserはAOSPのexternalにも入っていますが、mp4のファイル構造を取得・変更するためのライブラリらしいです。でもこのライブラリ自身では映像トラックをデコード&再エンコードして編集することは出来ないので、任意の再生時刻を切り出そうとするとやはり乱れた映像になってしまいます。
と言う事で、順序が逆になってしまいましたが次はMediaCodecを使った動画再生のサンプルを載せたいと思います。
MediaPlayerを使えば簡単なのに、何でわざわざMediaCodecを使うかって?それも次回ね。
お疲れ様でした。