今すぐ修復
- ファイルをドロップ
- 修復はローカルで実行
- 結果をダウンロード
Androidスマートフォン(Pixel、Samsung、Xiaomi、OnePlus など)は、プラットフォームの MediaRecorder と MediaMuxer APIを通じて動画を録画し、ISO base-media コンテナに標準的な .mp4 を書き出します。撮影中、映像と音声は mdat ボックスへと流し込まれますが、すべてのフレームを対応づけるインデックスである moov アトムは、最後にアプリが MediaMuxer.stop() を呼び出したときにのみ書き込まれます。アプリがその呼び出しにたどり着けなかった場合、有効なHEVCまたはH.264のデータが詰まっているのにインデックスのないファイルが残り、どのプレーヤーもそれを拒否します。上のエリアにファイルをドロップすれば、ツールはまさにこの点をブラウザ内でチェックし、素材が復元可能であればコンテナを再構築します。
Androidが.mp4をファイナライズしないまま残す理由
Androidのメディアスタックは、録画がいつ再生可能になるかを明確に定めています。キャプチャ中、MediaRecorder(あるいは MediaCodec と MediaMuxer を直接使うカメラアプリ)は、エンコード済みのサンプルを mdat に追記していきます。moov アトム(サンプルサイズ、チャンク(chunk)のオフセット、タイミングテーブル、そしてコーデックのパラメータセット)はメモリ上で組み立てられ、stop() と release() が実行されたときにのみファイル末尾へと書き出されます。この手順が飛ばされると、ディスク上のバイト列は頭のないMP4になります。本物のフレームはあるのに、地図がないのです。
原因となる中断は三つあります。カメラアプリがクラッシュした、またはシステムに強制終了された。 バグ、あるいはメモリ不足のもとでバックグラウンド/フォアグラウンドのアプリを回収するAndroidのlow-memory killer(低メモリキラー)が、stop() の前にプロセスを終わらせてしまうと、インデックスを書き込むものが何もありません。録画中にストレージが一杯になった。 4KのHEVCは書き込みが速く、内部ストレージやSDカードの空き容量がゼロバイトに達すると、muxerの書き込みが途中で失敗し、ファイルは moov のないまま切り詰められます。端末の電源が切れた。 キャプチャ中のバッテリー切れや強制再起動も、同じようにファイナライズを飛ばしてしまいます。
中身のコーデックは、HEVC/H.265(効率の高さから選ばれ、最近のAndroidの多くで高解像度モードの既定になっています)か、H.264/AVC(互換性のための代替)のどちらかです。コンテナの挙動はどちらも同一で、だからこそ修復の手順はコーデックに関係なく同じになります。
再構築できるもの、できないもの
フレームのデータは mdat に残っているため、修復とは MediaMuxer.stop() が書き残さなかったインデックスを再構築することです。ツールは生き残ったストリームを走査し、各フレームの境界とタイミングを復元し、サンプルテーブルを作り直して、プレーヤーが先頭からデコードできるようにします。つまり、頭のないファイルを、シークできる通常のMP4へと戻すのです。ディスクが一杯になってファイルが切り詰められている場合でも、切断の前に完全に書き込まれたフレームをサルベージし、その周りに再生可能なコンテナを閉じます。そのため、あるテイクの80%を捉えたクリップは、全体が失敗するのではなく、その80%を返してくれます。これらすべては、ファイルがストレージから読み込まれるのに合わせて、あなたのブラウザ内で実行されます。
正直に言えば、限界は、中断の後に書き込まれるはずだったフレームが存在しないという点です。ディスクが一杯になれば書き込みは止まり、クラッシュすればエンコーダは止まり、そして一度も保存されなかったバイトを、どんなツールも作り出すことはできません。手元に切り詰められたコピーしか残っていないなら、サルベージが正しい選択です。ただし、元のファイルがまだ端末に残っていて、単純にきれいにコピーし直せるなら、まずそちらを試してください。良いコピーは、どんな修復にも勝るからです。
同じ端末・同じアプリのクリップが役立つ理由
インデックスの再構築が最も確実になるのは、壊れたファイルが省いてしまった正確なコーデック設定をツールが把握しているときです。同じ端末で、同じアプリが同じモードで録画した正常なクリップは、まさにそれを提供してくれます。HEVCのパラメータセット(VPS/SPS/PPS)またはH.264のSPS/PPS、加えて解像度とフレームレートです。おかげで再構築は、近似ではなく元のとおりに再現できます。
実際には、同じカメラアプリと同じ画質設定で使い捨ての数秒を録画し、手元に用意しておいてください。コーデックを合わせておけば(HEVCのクリップにはHEVCのリファレンス、H.264にはH.264を)、修復が必要とするときにだけそれを求められます。別の端末や別のアプリのサンプルは、パラメータセットが異なるため、たいてい合致しません。
修復できるものとできないもの
修復できる
- カメラアプリや動画アプリが、MediaMuxer.stop() の前にクラッシュまたは強制終了されたためにファイナライズできなかった録画(moovが欠落)
- 録画中に内部ストレージやSDカードが一杯になって途中で途切れたクリップ
- キャプチャ中のバッテリー切れや強制再起動によって中断された録画
- 本物のフレームを含んでいるのに、Google フォト、ギャラリー、VLC、編集ソフトで開けないHEVCおよびH.264の.mp4ファイル
修復できない
- 中断より後の映像。それらのフレームはストレージに一度も書き込まれていません
- コピーの失敗や故障しかけたSDカードのあとで、0バイトまたはほぼゼロとして読み込まれるファイル
- DRMで保護された、または暗号化されたコンテンツ
- 同じ端末・同じアプリの一致するHEVCリファレンスがない、壊れたHEVCクリップ
修復が失敗した場合、その理由(データの欠落か構造の破損か)をお伝えします。失敗した修復に料金が請求されることはありません。