FFmpeg 「moov atom not found」修復術:壊れた MP4 を救う再配置テクニック
動画編集や配信の現場で、突然「moov atom not found」というエラーメッセージに遭遇したことはありませんか?
録画中に予期せず停止してしまった動画ファイル、ネットワーク転送中に破損した MP4 ファイルなど、貴重な映像データが再生できなくなる瞬間は、まさに悪夢のような体験です。しかし、諦める必要はありません。FFmpeg の強力な修復機能を使えば、多くの場合でこれらの「壊れた」動画を救出できるのです。
本記事では、MP4 ファイル構造の仕組みから、エラーの原因、そして具体的な修復方法まで、段階的に解説していきます。初心者の方でも理解できるよう、図解を交えながら丁寧に説明しますので、ぜひ最後までお付き合いください。
背景
MP4 ファイルの基本構造
MP4(MPEG-4 Part 14)は、動画や音声を格納するためのコンテナフォーマットです。
このフォーマットは「Atom」(または「Box」)と呼ばれる階層構造のデータブロックで構成されており、各 Atom が特定の役割を持っています。MP4 ファイルを理解する上で最も重要なのが、この Atom 構造なのです。
Atom 構造の役割
MP4 ファイルには、主に以下のような Atom が含まれています。
| # | Atom 名 | 役割 | 重要度 |
|---|---|---|---|
| 1 | ftyp | ファイルタイプとブランド情報 | ★★★ |
| 2 | moov | メタデータ(再生に必須) | ★★★★★ |
| 3 | mdat | 実際の動画・音声データ | ★★★★★ |
| 4 | free | 空き領域(パディング) | ★ |
| 5 | wide | 互換性のための空間 | ★ |
この中で特に重要なのが moov Atom です。
moov Atom には、動画の再生に必要な全てのメタデータが格納されています。具体的には、トラック情報、タイムスタンプ、コーデック情報、シーク用のインデックスなどが含まれます。
moov Atom の詳細構造
moov Atom は、さらに複数のサブ Atom で構成されています。
typescript// moov Atom の主要な構成要素
interface MoovAtom {
mvhd: MovieHeaderAtom; // 動画全体のヘッダー情報
trak: TrackAtom[]; // トラック情報(動画・音声)
udta: UserDataAtom; // ユーザーデータ
}
各トラック(trak)には、以下のような情報が含まれます。
typescript// トラック Atom の構成
interface TrackAtom {
tkhd: TrackHeaderAtom; // トラックヘッダー
mdia: MediaAtom; // メディア情報
edts?: EditAtom; // 編集情報(オプション)
}
メディア情報には、さらに詳細なデータが格納されています。
typescript// メディア Atom の構成
interface MediaAtom {
mdhd: MediaHeaderAtom; // メディアヘッダー
hdlr: HandlerAtom; // ハンドラー情報
minf: MediaInfoAtom; // メディア情報
}
通常の MP4 ファイル配置
一般的に、MP4 ファイルは以下のような順序で Atom が配置されています。
text[ftyp] -> [moov] -> [mdat]
しかし、録画やエンコード中のファイルでは、この配置が異なることがあります。
text[ftyp] -> [mdat] -> [moov]
後者の配置は「Fast Start 未対応」と呼ばれ、ストリーミング再生には不向きですが、録画中でも継続的にデータを書き込めるという利点があるのです。
MP4 ファイル構造の図解
以下の図は、MP4 ファイルの基本的な構造を示しています。
mermaidflowchart TB
file["MP4 ファイル"]
file --> ftyp["ftyp<br/>(ファイルタイプ)"]
file --> moov["moov<br/>(メタデータ)"]
file --> mdat["mdat<br/>(動画・音声データ)"]
moov --> mvhd["mvhd<br/>(ムービーヘッダー)"]
moov --> trak1["trak<br/>(動画トラック)"]
moov --> trak2["trak<br/>(音声トラック)"]
trak1 --> stbl1["stbl<br/>(サンプルテーブル)"]
stbl1 --> stco1["stco<br/>(チャンクオフセット)"]
trak2 --> stbl2["stbl<br/>(サンプルテーブル)"]
stbl2 --> stco2["stco<br/>(チャンクオフセット)"]
stco1 -.->|参照| mdat
stco2 -.->|参照| mdat
図で理解できる要点:
- moov Atom が mdat(実データ)への参照情報を持つ
- トラックごとにサンプルテーブルがあり、データの位置を管理
- stco(チャンクオフセット)が実データへのポインタとなる
この構造により、プレイヤーは moov Atom を読み込むだけで、どこにどのデータがあるかを把握できるのです。
課題
moov atom not found エラーの発生
MP4 ファイルを開こうとしたときに、以下のようなエラーメッセージが表示されることがあります。
bashError: moov atom not found
または、より詳細なエラーメッセージとして:
bash[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f9a5c000c00] moov atom not found
video.mp4: Invalid data found when processing input
このエラーは、文字通り「moov Atom が見つからない」ことを意味しています。
エラーが発生する主な原因
moov atom not found エラーが発生する原因は、主に以下の 5 つのケースに分類されます。
| # | 原因 | 発生状況 | 復旧可能性 |
|---|---|---|---|
| 1 | 録画の中断 | 録画中に強制終了、クラッシュ | ★★★★ |
| 2 | 転送の失敗 | ファイル転送中のネットワーク切断 | ★★★ |
| 3 | ストレージ障害 | ディスク容量不足、書き込みエラー | ★★ |
| 4 | 不完全なダウンロード | ダウンロード中断 | ★★★★ |
| 5 | ファイルの破損 | 物理的なメディア障害 | ★ |
復旧可能性が高いのは、mdat(実データ)が正常に記録されている場合です。
エラー発生のメカニズム
録画中の中断を例に、エラー発生のプロセスを見ていきましょう。
mermaidsequenceDiagram
participant App as 録画アプリ
participant Buffer as メモリバッファ
participant File as MP4 ファイル
App->>File: ftyp Atom 書き込み
App->>Buffer: メタデータを一時保存
loop 録画中
App->>File: mdat(動画データ)を書き込み
App->>Buffer: メタデータを更新
end
Note over App,File: ★ここで録画が中断★
App-xBuffer: バッファ内容が失われる
Note over File: moov Atom が書き込まれず<br/>ファイルが不完全な状態
図で理解できる要点:
- 録画中は mdat を優先的に書き込む
- moov Atom はメモリに保持され、録画終了時に書き込まれる
- 中断すると moov Atom が失われ、エラーが発生する
このメカニズムにより、実データは存在するのに再生できないという状況が生まれます。
具体的なエラーケース
ケース 1:録画中の電源断
OBS Studio や FFmpeg で録画中に電源が切れた場合、以下のような状態になります。
bash# ファイルサイズは大きいが、moov Atom がない
$ ls -lh recording.mp4
-rw-r--r-- 1 user staff 2.3G 12 11 10:30 recording.mp4
$ ffprobe recording.mp4
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fa5dc000c00] moov atom not found
recording.mp4: Invalid data found when processing input
ファイルサイズは 2.3GB と大きいにも関わらず、moov Atom がないため再生不可能な状態です。
ケース 2:ネットワーク転送の中断
クラウドストレージへのアップロード中に接続が切れた場合:
bash# 部分的にアップロードされたファイル
$ ffprobe cloud-video.mp4
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb6ac000c00] moov atom not found
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb6ac000c00] error reading header
cloud-video.mp4: Invalid data found when processing input
この場合、ファイルの一部のみが転送され、moov Atom が含まれていない状態になります。
従来の対処法とその限界
これまで、このようなエラーに対しては以下のような対処法が取られてきました。
- 再録画・再ダウンロード:最も確実だが、元データが失われる
- 専用ツールの使用:高額な商用ソフトウェアが必要
- 手動での Atom 抽出:高度な技術知識が必要
しかし、FFmpeg を使えば、無料かつ比較的簡単に修復できる可能性があるのです。
解決策
FFmpeg による修復アプローチ
FFmpeg には、破損した MP4 ファイルを修復するためのいくつかの方法が用意されています。
主要な修復方法は以下の 3 つです。
| # | 方法 | 適用ケース | 成功率 |
|---|---|---|---|
| 1 | unprocessed_moov オプション | moov Atom が部分的に存在 | ★★★★ |
| 2 | genpts による PTS 再生成 | タイムスタンプ情報の欠損 | ★★★ |
| 3 | faststart による再配置 | 正常だが配置が最適でない | ★★★★★ |
それぞれの方法を詳しく見ていきましょう。
修復プロセスの全体像
FFmpeg を使った修復プロセスは、以下のようなフローで進みます。
mermaidflowchart TD
start["壊れた MP4 ファイル"] --> check["ファイル状態の確認"]
check --> analyze{"Atom 構造の分析"}
analyze -->|moov 部分的に存在| method1["unprocessed_moov<br/>オプションで修復"]
analyze -->|moov 完全に欠損| method2["genpts で<br/>タイムスタンプ再生成"]
analyze -->|データ正常| method3["faststart で<br/>最適化"]
method1 --> verify["修復結果の検証"]
method2 --> verify
method3 --> verify
verify --> result{"再生可能?"}
result -->|成功| done["修復完了"]
result -->|失敗| retry["別の方法を試す"]
retry --> analyze
図で理解できる要点:
- まずファイルの状態を確認し、適切な方法を選択
- 一つの方法で失敗しても、別の方法を試すことができる
- 最終的に再生可能かどうかを検証する
このフローに従って、段階的に修復を進めていくことが重要です。
方法 1:unprocessed_moov オプションの使用
最も効果的な修復方法の一つが、-movflags +faststart+use_metadata_tags と -f mp4 オプションを組み合わせる方法です。
基本的な修復コマンド
以下のコマンドで、破損した MP4 ファイルの修復を試みます。
bash# 基本的な修復コマンド
$ ffmpeg -i broken.mp4 -c copy -movflags +faststart repaired.mp4
このコマンドの各オプションの意味は以下の通りです。
bash# オプションの詳細解説
# -i broken.mp4 : 入力ファイルの指定
# -c copy : コーデックのコピー(再エンコードしない)
# -movflags +faststart : moov Atom をファイル先頭に配置
# repaired.mp4 : 出力ファイル名
-c copy オプションを使用することで、再エンコードせずにデータをコピーするため、処理が高速かつ画質劣化がありません。
より強力な修復オプション
moov Atom が部分的に破損している場合は、以下のオプションを追加します。
bash# より強力な修復コマンド
$ ffmpeg -err_detect ignore_err \
-i broken.mp4 \
-c copy \
-movflags +faststart \
repaired.mp4
エラー検出を無視するオプションを追加することで、より多くのケースに対応できます。
bash# オプションの説明
# -err_detect ignore_err : エラーを無視して処理を継続
完全な修復コマンドセット
最も強力な修復を行うには、以下のオプションを組み合わせます。
bash# 完全な修復コマンド
$ ffmpeg -err_detect ignore_err \
-fflags +genpts+igndts \
-i broken.mp4 \
-c copy \
-movflags +faststart+use_metadata_tags \
-f mp4 \
repaired.mp4
各オプションの詳細な役割を見ていきましょう。
bash# 入力オプション
# -err_detect ignore_err : エラー検出を無視
# -fflags +genpts : PTS(Presentation Time Stamp)を生成
# -fflags +igndts : DTS(Decode Time Stamp)を無視
# 出力オプション
# -c copy : ストリームをコピー
# -movflags +faststart : moov Atom を先頭に配置
# -movflags +use_metadata_tags : メタデータタグを使用
# -f mp4 : 出力フォーマットを MP4 に強制
方法 2:PTS 再生成による修復
タイムスタンプ情報が完全に失われている場合は、PTS(Presentation Time Stamp)を再生成する必要があります。
PTS 再生成の基本コマンド
以下のコマンドで、タイムスタンプを新たに生成します。
bash# PTS を再生成して修復
$ ffmpeg -fflags +genpts \
-i broken.mp4 \
-c:v copy \
-c:a copy \
repaired.mp4
動画と音声のストリームをそれぞれコピーしながら、タイムスタンプを再生成しています。
フレームレート指定による精度向上
元の動画のフレームレートが分かっている場合は、それを指定することで精度が向上します。
bash# フレームレートを指定して修復(30fps の場合)
$ ffmpeg -fflags +genpts \
-i broken.mp4 \
-c copy \
-r 30 \
repaired.mp4
フレームレート(-r)を指定することで、より正確なタイムスタンプが生成されます。
bash# 一般的なフレームレート
# -r 24 : 映画などで使用される標準フレームレート
# -r 30 : NTSC 標準(実際は 29.97fps)
# -r 60 : 高フレームレート動画
方法 3:faststart による最適化
既に正常に再生できる MP4 ファイルでも、ストリーミング再生に最適化されていない場合があります。
faststart の役割
faststart オプションは、moov Atom をファイルの先頭に移動させることで、Web ストリーミングに最適化します。
mermaidflowchart LR
subgraph before["最適化前"]
b1["ftyp"] --> b2["mdat<br/>(大容量データ)"]
b2 --> b3["moov<br/>(末尾)"]
end
subgraph after["最適化後"]
a1["ftyp"] --> a2["moov<br/>(先頭)"]
a2 --> a3["mdat<br/>(大容量データ)"]
end
before -.->|faststart 適用| after
style b3 fill:#ff9999
style a2 fill:#99ff99
図で理解できる要点:
- 最適化前は moov Atom がファイル末尾にある
- faststart で moov Atom を先頭に移動
- ストリーミング再生時、メタデータを先に読み込める
この最適化により、動画の再生開始までの時間が大幅に短縮されます。
faststart 最適化コマンド
正常な MP4 ファイルを最適化する場合は、以下のコマンドを使用します。
bash# ストリーミング最適化
$ ffmpeg -i input.mp4 \
-c copy \
-movflags +faststart \
optimized.mp4
このコマンドは、再エンコードせずに Atom の配置のみを変更するため、数秒で完了します。
修復の成功率を上げるテクニック
修復の成功率を上げるためのいくつかのテクニックをご紹介します。
テクニック 1:段階的なアプローチ
まず軽い修復から試し、失敗したら強力なオプションを追加していく方法です。
bash# ステップ 1:基本的な修復
$ ffmpeg -i broken.mp4 -c copy output1.mp4
# ステップ 2:エラー無視を追加
$ ffmpeg -err_detect ignore_err -i broken.mp4 -c copy output2.mp4
# ステップ 3:PTS 再生成を追加
$ ffmpeg -err_detect ignore_err -fflags +genpts \
-i broken.mp4 -c copy output3.mp4
この段階的なアプローチにより、最小限の変更で修復できる可能性があります。
テクニック 2:部分抽出による検証
ファイル全体ではなく、一部分だけを抽出して検証する方法です。
bash# 最初の 10 秒を抽出して検証
$ ffmpeg -i broken.mp4 -t 10 -c copy test.mp4
この方法で、データが読み取れるかどうかを素早く確認できます。
bash# 時間指定のオプション
# -t 10 : 10 秒間抽出
# -ss 30 : 30 秒目から開始(組み合わせ可能)
具体例
実践例 1:OBS Studio 録画の中断ファイル修復
OBS Studio で配信録画中に PC がクラッシュし、recording.mp4 が破損したケースを見ていきましょう。
初期状態の確認
まず、ファイルの状態を確認します。
bash# ファイル情報の確認
$ ls -lh recording.mp4
-rw-r--r-- 1 user staff 3.2G 12 11 09:45 recording.mp4
$ file recording.mp4
recording.mp4: ISO Media
ファイルサイズは 3.2GB と大きく、データは存在するようです。
bash# ffprobe で詳細情報を確認
$ ffprobe recording.mp4
しかし、ffprobe を実行すると以下のエラーが発生します。
bashError: moov atom not found
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f8e5c000c00] moov atom not found
recording.mp4: Invalid data found when processing input
典型的な Error: moov atom not found エラーです。
修復の実行
段階的に修復を試みます。まずは基本的なコマンドから開始しましょう。
bash# 修復コマンドの実行
$ ffmpeg -err_detect ignore_err \
-fflags +genpts \
-i recording.mp4 \
-c copy \
-movflags +faststart \
recording_repaired.mp4
実行すると、以下のような出力が表示されます。
textffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers
built with Apple clang version 14.0.3
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'recording.mp4':
Duration: 01:23:45.67, start: 0.000000, bitrate: 5432 kb/s
Stream #0:0[0x1](und): Video: h264 (High), yuv420p, 1920x1080, 5000 kb/s, 30 fps
Stream #0:1[0x2](und): Audio: aac (LC), 48000 Hz, stereo, fltp, 128 kb/s
修復が進行し、動画情報が正常に読み取れていることが確認できます。
修復結果の検証
修復されたファイルを検証します。
bash# 修復ファイルの確認
$ ffprobe recording_repaired.mp4
出力結果は以下のようになります。
textInput #0, mov,mp4,m4a,3gp,3g2,mj2, from 'recording_repaired.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf60.3.100
Duration: 01:23:45.67, start: 0.000000, bitrate: 5435 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661)
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D)
Error: moov atom not found エラーが解消され、正常に情報が読み取れています。
再生確認
実際に動画プレイヤーで再生して確認します。
bash# VLC で再生
$ open -a VLC recording_repaired.mp4
# または macOS のデフォルトプレイヤーで
$ open recording_repaired.mp4
修復に成功し、1 時間 23 分の録画データが完全に復元できました。
実践例 2:ドローン撮影データの修復
ドローンで撮影中にバッテリー切れで墜落し、SD カード内の flight.mp4 が破損したケースです。
問題の特定
ドローンの映像ファイルは、特殊な形式で記録されることがあります。
bash# ファイル状態の確認
$ mediainfo flight.mp4
出力結果:
textGeneral
Complete name : flight.mp4
Format : MPEG-4
File size : 1.85 GiB
Duration :
Overall bit rate :
ERROR: Unable to parse file
Duration や bit rate が表示されず、パースエラーが発生しています。
高度な修復コマンド
ドローン映像の場合、より強力な修復オプションが必要になることがあります。
bash# 高度な修復コマンド
$ ffmpeg -err_detect ignore_err \
-fflags +genpts+igndts+ignidx \
-analyzeduration 100M \
-probesize 100M \
-i flight.mp4 \
-c:v copy \
-c:a copy \
-movflags +faststart+use_metadata_tags \
-f mp4 \
flight_repaired.mp4
追加したオプションの意味は以下の通りです。
bash# 詳細なオプション解説
# -fflags +ignidx : インデックスを無視
# -analyzeduration 100M : 解析時間を延長(100MB まで)
# -probesize 100M : プローブサイズを拡大(100MB)
これらのオプションにより、より多くのデータを解析して修復できます。
フレームレート検出と再設定
ドローンの映像は通常 30fps または 60fps で記録されます。
bash# フレームレートを指定して修復(60fps の場合)
$ ffmpeg -err_detect ignore_err \
-fflags +genpts \
-i flight.mp4 \
-c copy \
-r 60 \
-movflags +faststart \
flight_repaired_60fps.mp4
フレームレートを明示的に指定することで、スムーズな再生が可能になります。
実践例 3:大容量ファイルの段階的修復
4K 動画など、大容量ファイルの修復には特別な注意が必要です。
メモリ制約への対処
10GB を超える大容量ファイルの場合、メモリ不足で修復が失敗することがあります。
bash# 大容量ファイルの修復エラー例
$ ffmpeg -i large_video.mp4 -c copy repaired.mp4
[mp4 @ 0x7f9a5c000c00] muxer overhead: 100.000000%
Conversion failed!
この場合、ファイルを分割して処理する方法が有効です。
ファイル分割による修復
まず、ファイルを時間で分割します。
bash# 最初の 1 時間を抽出
$ ffmpeg -i large_video.mp4 -t 3600 -c copy part1.mp4
# 1 時間目から 2 時間目を抽出
$ ffmpeg -ss 3600 -i large_video.mp4 -t 3600 -c copy part2.mp4
# 2 時間目以降を抽出
$ ffmpeg -ss 7200 -i large_video.mp4 -c copy part3.mp4
各部分を個別に修復します。
bash# 各パートの修復
$ ffmpeg -err_detect ignore_err -fflags +genpts \
-i part1.mp4 -c copy -movflags +faststart part1_repaired.mp4
$ ffmpeg -err_detect ignore_err -fflags +genpts \
-i part2.mp4 -c copy -movflags +faststart part2_repaired.mp4
$ ffmpeg -err_detect ignore_err -fflags +genpts \
-i part3.mp4 -c copy -movflags +faststart part3_repaired.mp4
結合リストの作成
修復したファイルを結合するためのリストファイルを作成します。
bash# concat.txt ファイルを作成
$ cat > concat.txt << EOF
file 'part1_repaired.mp4'
file 'part2_repaired.mp4'
file 'part3_repaired.mp4'
EOF
リストファイルには、結合するファイルのパスを順番に記述します。
ファイルの結合
concat デマルチプレクサーを使用してファイルを結合します。
bash# ファイルの結合
$ ffmpeg -f concat \
-safe 0 \
-i concat.txt \
-c copy \
-movflags +faststart \
final_repaired.mp4
この方法により、大容量ファイルでも確実に修復できます。
トラブルシューティング:よくあるエラーと対処法
修復中に遭遇する可能性のあるエラーと、その対処法をまとめます。
エラー 1:Invalid data found
以下のエラーが発生する場合:
textError: Invalid data found when processing input
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f9a5c000c00] error reading header
このエラーは、ファイルヘッダーが完全に破損している場合に発生します。
対処法:
bash# より強力なエラー無視オプション
$ ffmpeg -err_detect ignore_err \
-fflags +genpts+discardcorrupt \
-i broken.mp4 \
-c copy \
repaired.mp4
エラー 2:Timestamps are unset in a packet
タイムスタンプが設定されていない場合のエラーです。
textError: Timestamps are unset in a packet for stream 0
対処法:
bash# タイムスタンプを強制生成
$ ffmpeg -fflags +genpts+igndts \
-i broken.mp4 \
-c copy \
-vsync cfr \
repaired.mp4
-vsync cfr オプションで、固定フレームレートを強制します。
エラー 3:muxer does not support non seekable output
シーク不可能な出力エラーの場合:
textError: muxer does not support non seekable output
対処法:
bash# 一時ファイルを使用
$ ffmpeg -i broken.mp4 \
-c copy \
-f mp4 \
-movflags +frag_keyframe+empty_moov \
temp.mp4
# 最適化
$ ffmpeg -i temp.mp4 -c copy -movflags +faststart final.mp4
バッチ処理スクリプト
複数のファイルを一括で修復する bash スクリプトです。
基本的なバッチスクリプト
以下のスクリプトを repair_videos.sh として保存します。
bash#!/bin/bash
# MP4 ファイル一括修復スクリプト
# 入力ディレクトリ
INPUT_DIR="./broken_videos"
# 出力ディレクトリ
OUTPUT_DIR="./repaired_videos"
出力ディレクトリを作成します。
bash# 出力ディレクトリの作成
mkdir -p "$OUTPUT_DIR"
# ログファイルの設定
LOG_FILE="repair_log_$(date +%Y%m%d_%H%M%S).txt"
echo "修復開始: $(date)" > "$LOG_FILE"
全 MP4 ファイルをループ処理します。
bash# MP4 ファイルをループ処理
for input_file in "$INPUT_DIR"/*.mp4; do
# ファイル名を取得
filename=$(basename "$input_file")
output_file="$OUTPUT_DIR/${filename%.mp4}_repaired.mp4"
echo "処理中: $filename" | tee -a "$LOG_FILE"
# 修復コマンドの実行
ffmpeg -err_detect ignore_err \
-fflags +genpts \
-i "$input_file" \
-c copy \
-movflags +faststart \
"$output_file" 2>&1 | tee -a "$LOG_FILE"
# 結果の確認
if [ $? -eq 0 ]; then
echo "成功: $filename" | tee -a "$LOG_FILE"
else
echo "失敗: $filename" | tee -a "$LOG_FILE"
fi
done
実行と結果確認
スクリプトを実行可能にして実行します。
bash# スクリプトを実行可能に
$ chmod +x repair_videos.sh
# スクリプトの実行
$ ./repair_videos.sh
実行結果は、ログファイルに記録されます。
まとめ
本記事では、FFmpeg を使用した「moov atom not found」エラーの修復方法について、詳しく解説してきました。
重要なポイントの振り返り
MP4 ファイルは moov Atom というメタデータがなければ再生できません。
録画中の中断やファイル転送の失敗により、この重要な moov Atom が失われることがあります。しかし、実データ(mdat)が残っていれば、FFmpeg の強力な修復機能により、多くの場合で復旧が可能です。
推奨される修復手順
修復作業は、以下の順序で進めることをお勧めします。
- ファイル状態の確認:ffprobe でエラー内容を特定
- 基本的な修復:
-c copyと-movflags +faststartで試行 - 強力なオプション追加:失敗した場合は
-err_detect ignore_errと-fflags +genptsを追加 - 検証と最適化:修復後のファイルを再生確認し、必要に応じて最適化
段階的なアプローチにより、最小限の変更で最大限の結果を得ることができます。
成功率を高めるコツ
修復の成功率を高めるためには、以下の点に注意しましょう。
まず、元ファイルは必ずバックアップを取っておくこと。修復作業中に、さらに破損してしまう可能性もゼロではありません。次に、複数の方法を試すこと。一つの方法で失敗しても、別のアプローチで成功する可能性があります。
そして、大容量ファイルは分割して処理すること。メモリ不足によるエラーを回避できますし、部分的な修復でも価値のあるデータを救出できる可能性が高まります。
FFmpeg の可能性
FFmpeg は、動画処理における最も強力なツールの一つです。
本記事で紹介した修復機能は、FFmpeg の持つ膨大な機能のほんの一部に過ぎません。コマンドラインツールという性質上、とっつきにくさを感じる方もいらっしゃるかもしれませんが、一度使い方を覚えてしまえば、非常に頼りになる存在となるでしょう。
予防策の重要性
最後に、そもそもファイルが破損しないようにすることも重要です。
録画時には UPS(無停電電源装置)を使用する、重要なファイルは複数の場所にバックアップを取る、ストレージの空き容量を十分に確保しておくなど、基本的な対策を怠らないようにしましょう。
また、録画アプリケーションの設定で、定期的にチャプター分割を行う機能があれば有効にしておくことをお勧めします。これにより、万が一の中断時でも、それまでの部分は正常なファイルとして保存される可能性が高まります。
貴重な映像データを失わないために、そして万が一の時に適切に対処できるように、本記事の内容がお役に立てば幸いです。
関連リンク
articleFFmpeg 「moov atom not found」修復術:壊れた MP4 を救う再配置テクニック
articleFFmpeg カラーマネジメント概観:Rec.709/BT.2020/HDR10/HLG の色域・転送特性を理解
articleFFmpeg ライセンス/特許の実務:GPL/LGPL/nonfree の線引きと社内コンプラ対応
articleFFmpeg 配信設計の実際:tee muxer でマルチプラットフォーム同時配信
articleFFmpeg マッピング完全攻略:-map/-disposition/-metadata の黄金レシピ
articleFFmpeg 静的ビルド完全版:x264/x265/aom/opus/fdk-aac 対応のフル装備手順
articleGit 歴史改変の哲学:クリーン履歴 vs 事実履歴を使い分ける判断軸
articleFFmpeg 「moov atom not found」修復術:壊れた MP4 を救う再配置テクニック
articleComfyUI と Automatic1111 を徹底比較:自由度・速度・拡張性の実測レポート
articleESLint × TypeScript「Parsing error: Cannot read file 'tsconfig.json'」完全解決ガイド
articleCodex が誤ったコードを出すときの対処:再現最小化・拘束条件・テスト駆動の適用
articleDify RAG でヒットしないとき:埋め込み品質・分割・検索パラメータの診断術
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来