GoPro 7 / 12 で撮った動画ファイルのリネーム
備忘録です。
検索してもコレ!というのがなかなかヒットしないので、自分でせっせこ試した結果を貼っておきます。
自分はGoPro Hero7 BlackとGoPro Hero12 Blackの2台で撮影しているのですが、世代によって保存形式やexifデータに差異があるようで、それぞれに使うコマンドを用意しました。
手元に全世代があるわけではないので、厳密にどの世代がどれ、とは検証できていないのですが、おそらくGoPro8以前と9以降あたりで違ってそうな気がします。(自己責任でお願いします…)
大事なこと
この項目に書かれている内容が理解できない方はやめておきましょう。
コマンドを間違えると最悪動画データがすべてぐちゃぐちゃになる可能性があります。
かならず動画ファイルのバックアップを取ってから、テスト用に作業ディレクトリを作ってから実行して、期待した結果が得られることを確認してください。
ターミナルやコマンドプロンプトの基本的な操作方法(cd、lsなど)が分からない方は調べて勉強してください。(我々が現役な間は一生使える知識だと思います)
また、検証環境はMacOS Sonoma 14.5(23F79)です。
ある程度新しいMacOSなら問題なく動作するはずです。
ExiftoolはHomebrewを使ってインストールしています。
Homebrewとは何か分からない方は検索して調べてみて、理解できなかったらやめておきましょう。
Homebrew公式はこちら。
やることはターミナルにコマンド1行をコピペするのみです。
/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
https://brew.sh/ja/
homebrewがインストール出来たらターミナルで以下のコマンド実行でexiftoolがインストールできます。
brew install exiftool
Windowsの方は「Windows Exiftool」などで検索して、コマンドプロンプトで実行可能なexecutableをインストールしましょう。
準備はここまでです。
GoPro7,GoPro12ともに一括置換するスクリプト
7と12でexif情報に差異があって、なかなかワンライナーでうまくいく方法が見つけられなかったのですが、最終的にシェルスクリプトにまとめたのでこれを叩けばどちらのGoProファイルでもいけます。
## GoProRename.sh
# ソースディレクトリ
dir="."
# 移動先ディレクトリ
destination="./out"
# MP4ファイルのみを処理
cd "$dir"
shopt -s nullglob
for file in *.[mM][pP][4]; do
# exiftoolで作成日を取得
date=$(exiftool -api QuickTimeUTC=1 -p '$CreateDate' -d %Y-%m-%d $file)
# 移動先ディレクトリにサブディレクトリを作成
mkdir -p "$destination/$date"
# ファイルを一時的に移動
mv -n "$file" "$destination/$date/$file"
done
# 各日付のディレクトリで連番をつける
for folder in $(ls -d "$destination"/*/); do
cd "$folder"
ls -1rt | cat -n | while read n f; do mv -n "$f" "$(printf "%04d" $n).mp4"; done
cd -
done
shopt -u nullglob
上のコードをメモ帳などテキストエディタに貼り付けて、適当な名前をつけて拡張子.shで保存してください。
(GoProRename.sh など)
保存できたらファイルをGoPro動画ファイル(GXxxxxxxx.mp4)が置いてあるディレクトリにコピーします。
ターミナルで該当ディレクトリに移動し(cdコマンドなどで移動しましょう)、ファイルに実行権限を付けます。
chmod +x GoProRename.sh
実行権限が付与されたことを確認します。
work % ls -ln
-rwxr-xr-x@ 1 501 0 770 1 4 17:52 GoProRename.sh
確認できたら実行します。
work % ./GoProRename.sh
Warning: [minor] The ExtractEmbedded option may find more tags in the media data - GH010130.MP4
Warning: [minor] The ExtractEmbedded option may find more tags in the media data - GH020130.MP4
Warning: [minor] The ExtractEmbedded option may find more tags in the media data - GH030130.MP4
...
Warningが出る場合もありますが、無視してOKです。
完了するとカレントディレクトリに out というディレクトリが作られ、その中に日付ごとのディレクトリが作成され、時間ごとの連番でmp4がリネームされて格納されます。
おまけ
以下は、ここに行き着くまでに調べてた備忘録ですので、興味のある方だけどうぞ。
上にあるスクリプトでGoPro7でも12でも同じ動きをするようになっているので、以下は試す必要はありません。
GoPro7でのexiftoolコマンド
GoProのタイムスタンプがUTCのため9時間ズレていますので、ファイルシステムのCreateDateを使うことで撮影開始日時を取得してリネームします。
作業ディレクトリにSDカードから抜き出した動画ファイル(GXxxxxxx.MP4)を置いて、ターミナルで作業ディレクトリに移動して以下のコマンドを実行します。
exiftool '-filename<CreateDate' -d %Y-%m-%d-%H-%M-%S%%-c.%%e -r ./
すると「2023-07-26-05-19-07.mp4」のような「撮影開始日時.mp4」にリネームされます。
しっかり撮影した日と順序でリネームされているはずです。
(もしかすると、設定や機種によってカバーしきれてないこともあるかも…)
GoPro7では長尺で長い動画を回すと、ファイルが分割されるたびに新しいCreateDateが付与されるようです。
なので1回の撮影時間が長尺で分割されたファイル群で実行するとこんな感じになります。
上記は1080、60fpsで撮影していたので、17:38で4GBに分割されています。
GoPro12でのexiftoolコマンド
GoPro12だと長尺で回したファイルが分割されるとき、GoPro7とは違う感じで保存されています。
CreateDateは分割された全ファイルで同じものを継承しているため、GoPro7で使ったコマンドだとファイル名が同じになりエラーが発生します。
そのため、exiftoolのオプションで日次の末尾に連番を付与することでファイル名が被らないようにする必要があるのですが、これがいろいろ実験しても撮影順の連番にならないケースがありました。
一旦このコマンドを実行してみると
//撮影単位を把握するため一旦リネーム(連番は狂う)
exiftool -api QuickTimeUTC=1 "-FileName<CreateDate" -d "%Y-%m-%d-%H-%M-%S-%%2c.%%e" .
いい感じにリネームはされるのですが、ファイル名でソートして中身を見ていくと、順番があっちこっちにズレてることがあります。