T-CREATOR

FFmpeg 「moov atom not found」修復術:壊れた MP4 を救う再配置テクニック

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 名役割重要度
1ftypファイルタイプとブランド情報★★★
2moovメタデータ(再生に必須)★★★★★
3mdat実際の動画・音声データ★★★★★
4free空き領域(パディング)
5wide互換性のための空間

この中で特に重要なのが 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 が含まれていない状態になります。

従来の対処法とその限界

これまで、このようなエラーに対しては以下のような対処法が取られてきました。

  1. 再録画・再ダウンロード:最も確実だが、元データが失われる
  2. 専用ツールの使用:高額な商用ソフトウェアが必要
  3. 手動での Atom 抽出:高度な技術知識が必要

しかし、FFmpeg を使えば、無料かつ比較的簡単に修復できる可能性があるのです。

解決策

FFmpeg による修復アプローチ

FFmpeg には、破損した MP4 ファイルを修復するためのいくつかの方法が用意されています。

主要な修復方法は以下の 3 つです。

#方法適用ケース成功率
1unprocessed_moov オプションmoov Atom が部分的に存在★★★★
2genpts による PTS 再生成タイムスタンプ情報の欠損★★★
3faststart による再配置正常だが配置が最適でない★★★★★

それぞれの方法を詳しく見ていきましょう。

修復プロセスの全体像

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 の強力な修復機能により、多くの場合で復旧が可能です。

推奨される修復手順

修復作業は、以下の順序で進めることをお勧めします。

  1. ファイル状態の確認:ffprobe でエラー内容を特定
  2. 基本的な修復-c copy-movflags +faststart で試行
  3. 強力なオプション追加:失敗した場合は -err_detect ignore_err-fflags +genpts を追加
  4. 検証と最適化:修復後のファイルを再生確認し、必要に応じて最適化

段階的なアプローチにより、最小限の変更で最大限の結果を得ることができます。

成功率を高めるコツ

修復の成功率を高めるためには、以下の点に注意しましょう。

まず、元ファイルは必ずバックアップを取っておくこと。修復作業中に、さらに破損してしまう可能性もゼロではありません。次に、複数の方法を試すこと。一つの方法で失敗しても、別のアプローチで成功する可能性があります。

そして、大容量ファイルは分割して処理すること。メモリ不足によるエラーを回避できますし、部分的な修復でも価値のあるデータを救出できる可能性が高まります。

FFmpeg の可能性

FFmpeg は、動画処理における最も強力なツールの一つです。

本記事で紹介した修復機能は、FFmpeg の持つ膨大な機能のほんの一部に過ぎません。コマンドラインツールという性質上、とっつきにくさを感じる方もいらっしゃるかもしれませんが、一度使い方を覚えてしまえば、非常に頼りになる存在となるでしょう。

予防策の重要性

最後に、そもそもファイルが破損しないようにすることも重要です。

録画時には UPS(無停電電源装置)を使用する、重要なファイルは複数の場所にバックアップを取る、ストレージの空き容量を十分に確保しておくなど、基本的な対策を怠らないようにしましょう。

また、録画アプリケーションの設定で、定期的にチャプター分割を行う機能があれば有効にしておくことをお勧めします。これにより、万が一の中断時でも、それまでの部分は正常なファイルとして保存される可能性が高まります。

貴重な映像データを失わないために、そして万が一の時に適切に対処できるように、本記事の内容がお役に立てば幸いです。

関連リンク