ビデオカメラで撮ったデータにて、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 にも適切に認識されるようになったので、一旦これでよしとする。