SDカードの動画取り込みを確認する方法|重複・コピー漏れ・NAS保管とPython照合

SDカードの素材取り込みは、コピーしたファイル名だけで完了と判断せず、元とコピー先の内容が一致したか確認する。カメラが同じ名前を繰り返す場合や、コピーが途中で止まった場合、見た目の一覧だけでは欠損を見逃すことがある。

AIに素材整理を任せる前に、「原本を保管する場所」「編集する場所」「AIが扱う作業用コピー」を決めたい。この記事ではフォルダーを分けた取り込み手順と、SHA-256で照合する読み取り専用のPython例を示す。合成ファイルを使った6種類のテストを実行した。実際のSDカードやNASの速度は測定していない。

目次

ファイル名・容量・ハッシュで分かること

比較する情報 分かること これだけでは分からないこと
ファイル名 指定の相対パスにあるか 同名でも中身が違うか
容量 サイズの差 同じ容量の別内容
SHA-256 読み取ったファイル内容の一致 撮影自体の欠落・音ズレ・映像の品質
再生確認 映像・音声が期待どおりか 全バイトの一致

カード単位のフォルダーを作る

shoot-20261031/
  originals/
    camera-a-card01/DCIM/...
    camera-b-card01/DCIM/...
  working/
  ai-input/
  reports/

同じC001.mp4でも、カメラやカードが違えば別素材の可能性がある。取り込み時はカード単位の区別と元のフォルダー構造を維持する。日付だけ、ファイル名だけで平らな1フォルダーへまとめない。既存の取り込みを上書きするより、新しいバッチ名で保存して確認する方が追跡しやすい。

取り込みと再実行の6ステップ

  1. コピー先の空き容量と、取り込むカード・撮影日の対応を確認する。
  2. カード単位で新しい保存先を作り、OSのコピー操作で素材をコピーする。原本は移動・削除しない。
  3. コピー完了後、元フォルダーとコピー先を以下のスクリプトで照合する。
  4. missingやdifferentがあれば、その相対パスを確認する。壊れたコピーを残したまま別の新規バッチへ取り直し、再照合する方法もある。
  5. 照合が通った素材から、編集用またはAI用のコピーを作る。必要なクリップだけを対象にする。
  6. 別の保存先へのバックアップと代表クリップの再生を確認し、カードの再利用は撮影運用のルールに従って判断する。

読み取り専用の照合コード

Python 3の標準ライブラリだけを使う。以下をverify_copy.pyとして保存し、2つのフォルダーを引数に渡す。スクリプトはファイルのコピー・改名・削除を行わず、結果を画面へ出す。パスに空白がある場合は引用符で囲む。

python3 verify_copy.py "/path/to/card/DCIM" "/path/to/copy/DCIM"
検証済みのverify_copy.pyを表示
"""Read-only comparison of a source batch and its copied directory."""
import hashlib
import json
import sys
from pathlib import Path

def digest(path):
    before = path.stat()
    h = hashlib.sha256()
    with path.open("rb") as f:
        for block in iter(lambda: f.read(1024 * 1024), b""):
            h.update(block)
    after = path.stat()
    if (before.st_size, before.st_mtime_ns) != (after.st_size, after.st_mtime_ns):
        raise ValueError(f"changed while reading: {path}")
    return h.hexdigest()

def verify(source, target):
    source, target = Path(source).resolve(), Path(target).resolve()
    if source == target or source in target.parents or target in source.parents:
        raise ValueError("use separate source and target folders")
    if not source.is_dir() or not target.is_dir():
        raise ValueError("both folders must exist")
    rows, hashes = [], {}
    for path in sorted(source.rglob("*")):
        if path.is_symlink():
            raise ValueError(f"symbolic link unsupported: {path}")
        if not path.is_file():
            continue
        relative = path.relative_to(source)
        copied = target / relative
        if any(p.is_symlink() for p in [copied, *copied.parents] if p != target and target in p.parents):
            raise ValueError(f"target symbolic link unsupported: {copied}")
        value = digest(path)
        status = "missing"
        if copied.is_file():
            status = "match" if digest(copied) == value else "different"
        rows.append({"path": relative.as_posix(), "sha256": value, "status": status})
        hashes.setdefault(value, []).append(relative.as_posix())
    if not rows:
        raise ValueError("source has no files")
    return {"files": rows, "same_content_groups": [v for v in hashes.values() if len(v) > 1],
            "all_match": all(r["status"] == "match" for r in rows)}

if __name__ == "__main__":
    report = verify(*sys.argv[1:])
    print(json.dumps(report, ensure_ascii=False, indent=2))
    sys.exit(0 if report["all_match"] else 1)

all_matchがtrueなら、元フォルダーにあった全ファイルをコピー先の同じ相対パスで読み、一致を確認できたという意味だ。コピー先だけにある余分なファイルの検出、空フォルダーやファイル属性の比較は行わない。ハッシュ読み取りにも時間がかかるため、巨大な動画ではコピー後の照合時間も見込む。

結果 意味 次にすること
match 内容が一致 取り込み記録へ残す
missing 同じ相対パスにファイルがない 取り込み先と構造を確認
different ファイル内容が違う 原本を残し、再コピーと再照合
same_content_groups 元フォルダー内に同じ内容がある 重複候補として記録。自動削除しない
例外で停止 同じ/入れ子のフォルダー、リンク、読み取り中の変化など 原因を解消してから再確認

NASを使う場合もAI用コピーを分ける

NASの原本保存領域から、今回の処理に必要な素材だけを作業領域へコピーする。AIには作業領域を指定し、確認済みの成果物を別のoutputへ保存させる。原本の削除権限を与えなくても、字幕案やカット候補表の作成はできる。接続経路と権限を確認し、NASの管理画面を公開する必要はない。

作業フォルダーの同期は、誤削除も伝えることがある。原本、作業用コピー、別保存先のバックアップを役割で分け、復元できるかを試す。ここでは特定NASの購入推奨や、RAIDだけで十分という判断は行わない。編集準備へのつなぎ方はDaVinci Resolve×Claudeの工程を参照できる。

合成ファイルでの検証結果

一致と重複候補、同じ容量で異なる内容、欠損から再コピー後の一致、シンボリックリンクの拒否、同一フォルダーの拒否、入れ子フォルダーの拒否の6種類をテストし、すべて期待どおりの結果を確認した。サンプルの.binファイルでの検証であり、カメラの特殊なディレクトリ構造や全NAS環境を保証するものではない。

作業に使える依頼文6例

1.取り込み計画

Design a folder layout for two cameras and three cards. Preserve each card identity and relative paths. Do not move or delete any files.

2.照合結果の整理

Read this verification report. List missing and different files by relative path. Do not mark the batch complete if any file is unresolved.

3.重複の扱い

List same-content groups as review candidates. Keep all originals and explain that duplicate content is not permission to delete.

4.再実行計画

Prepare a retry plan for this failed batch. Specify a new destination, the source paths, and the required verification. Execute nothing yet.

5.AI入力を限定

Select only the approved clip IDs for analysis. Use the working-copy directory and write results to output. Never rename the originals.

6.完了記録

Produce a batch record with source identifier, destination, file count, verification result, playback checks, backup location, and unresolved items.

よくある質問

SHA-256が一致すればカードを消してよいか

照合対象の内容が一致したことしか示さない。バックアップ、再生、撮影の欠けを確認したうえでカード再利用を判断する。

同じ容量なら同じ動画か

違う場合がある。サンプルでも同容量の別内容をdifferentとして検出した。

重複候補をAIに削除させてよいか

この手順では削除しない。別案件で必要な同一素材もあるため、保存目的を人が確認する。

コピーが途中で止まったらどうするか

原本を維持し、欠損と不一致を特定する。再コピー後はもう一度照合する。

クラウド同期だけでバックアップになるか

削除や上書きが同期される構成では、元に戻せるとは限らない。復元方法と別保存先を確認する。

小さく始める3ステップ

  1. 今日:記事の入力例を、自分の仕事1件に置き換えて準備する。
  2. 今週:確認担当を決め、下書きと実際の原本を照合して1件を完了させる。
  3. 来月:手戻り、確認時間、失敗件数を振り返り、対象を広げるか判断する。

出典・検証範囲

確認日:2026年10月31日。掲載照合コードを合成ファイルで6種類テストした。実SDカード・NASの性能、破損メディアの復旧、動画の再生品質は未検証。画面名、提供地域、料金、接続条件は変更されるため、導入時は公式案内を再確認する。

企画の参考:Nagomi-ke:動画制作フロー。動画内の利用成果を編集部の実績として扱っていない。

LIFRELLへの相談

AIに渡す資料、担当者の確認、成果物の保存まで含めた業務フローの設計は、LIFRELLの無料相談で相談できる。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次