ビデオカメラで撮ったデータにて、mp4 を取り出したかった。 SDカードを開いたときに AVCHD ってファイルがあったけど、どうしたらいいか…。 ## .mts ファイルを見つける 回答「`PRIVATE > AVCHD > BDMV > STREAM` にいます」 `PRIVATE > AVCHD` があるので AVCHD を右クリックして `Show Package Contents`。 表示される BDMV も右クリックして `Show Package Contents`。 ここに表示される `STREAM` の中に 連番の .mts が入ってる。 ## .mts を mp4 に変換 `ffmpeg` を使用する。 ```bash # エンコードなし(MTSコーデック対応機種で再生可/変換が高速/劣化なし/ファイルサイズほぼ同じ) for file in *.MTS; do ffmpeg -i "$file" -c:v copy -c:a copy "${file%.MTS}.mp4" done # エンコードあり(古い機種で再生可/変換時間≒動画時間/わずかに画質劣化/ファイルサイズ30%-50%) for file in *.MTS; do ffmpeg -i "$file" -c:v libx264 -c:a aac "${file%.MTS}.mp4" done ``` 「画質重視」ならエンコードしない、「容量や互換性重視」ならエンコードが有効っぽい。 M4 Max なのでエンコード+並列実行版で行った。 以下を `encode.sh` として、`*.MTS` ファイル(複数)と同階層に配置して実行する。 ```bash # エンコードあり(並列処理版) for file in *.MTS; do ffmpeg -i "$file" -c:v libx264 -c:a aac "${file%.MTS}.mp4" & [ $(jobs -r | wc -l) -ge 4 ] && wait -n done wait ``` ## 日付を合わせる コピーしたときに、撮影日/作成日/更新日 などの日付がズレてしまった。 ```diff # MTS のメタ情報 $ exiftool 00000.MTS | grep Date + File Modification Date/Time : 2023:12:04 10:58:22+09:00 File Access Date/Time : 2025:09:05 12:45:22+09:00 File Inode Change Date/Time : 2025:09:05 11:58:54+09:00 + Date/Time Original : 2023:12:04 10:58:17+09:00 GPS Date Stamp : 2023:10:29 GPS Date/Time : 2023:10:29 16:10:17Z # mp4 のメタ情報 $ exiftool 00000.mp4 | grep Date + File Modification Date/Time : 2025:09:05 11:28:11+09:00 File Access Date/Time : 2025:09:05 12:45:30+09:00 File Inode Change Date/Time : 2025:09:05 12:45:30+09:00 Create Date : 0000:00:00 00:00:00 Modify Date : 0000:00:00 00:00:00 Track Create Date : 0000:00:00 00:00:00 Track Modify Date : 0000:00:00 00:00:00 Media Create Date : 0000:00:00 00:00:00 Media Modify Date : 0000:00:00 00:00:00 ``` これを `exiftool` を使って合わせる。 https://formulae.brew.sh/formula/exiftool 以下を `preserve_dates.sh` として実行する。 ```bash for mts in *.MTS; do mp4="${mts%.MTS}.mp4" if [ -f "$mp4" ]; then # 元の MTS ファイルからすべての時間関連タグ(DateTimeOriginal, CreationDate など)を MP4 にコピー # -overwrite_original はバックアップを作らずに上書き。-m はマイナーエラーを無視 exiftool -tagsFromFile "$mts" -time:all -overwrite_original -m "$mp4" # ファイルシステム上の修正日時(mtime)を元の MTS と同じに揃える # これにより Finder や ls で表示される「変更日時」が更新される touch -r "$mts" "$mp4" fi done ``` ※ `-time:all` → `-all:all` にするとMTSファイルのメタデータを可能な限りMP4にコピーする。 `exiftool -tagsFromFile {input} -time:all -overwrite_original {output}` によって `Date/Time Original`, `GPS Date/Time` が追加、 `touch -r {input} {output}` によって `File Modification Date/Time` が変更される。 ```diff $ exiftool -time:all 00000.mp4 - File Modification Date/Time : 2025:09:05 11:28:11+09:00 + File Modification Date/Time : 2023:12:04 10:58:22+09:00 File Access Date/Time : 2025:09:05 13:48:09+09:00 File Inode Change Date/Time : 2025:09:05 13:43:07+09:00 Create Date : 0000:00:00 00:00:00 Modify Date : 0000:00:00 00:00:00 Track Create Date : 0000:00:00 00:00:00 Track Modify Date : 0000:00:00 00:00:00 Media Create Date : 0000:00:00 00:00:00 Media Modify Date : 0000:00:00 00:00:00 + Date/Time Original : 2023:12:04 10:58:17+09:00 + GPS Date/Time : 2023:10:29 16:10:17Z ``` Mac / Google Photos にも適切に認識されるようになったので、一旦これでよしとする。