久々に記事を書きます。ヒノマルクです。
MacでMTSファイルを任意の時間で分割する方法
数日前にデジカメを整理している記事を書きました。画像ファイルのEXIF情報の編集方法だったのですが、今回はMTSファイルという動画ファイルの編集になります。mts ファイルとは(.mts)パナソニックとソニーの間で取り決められたビデオカメラ...
でも書きましたが、我が家は子供たちの画像や動画の管理に「みてね」を使っています。
引用: https://mitene.us/premium
最近値上げをしてプレミアムProだと月1090円もしくは年10900円になりました。
(この記事を書くまで年間プランが存在することを知らなかったのでさっそく切り替えようと思っています 笑)
私が動画を撮るのが好きなので、アップロードできる時間の制限はありつつも、プレミアムProで容量無制限でフルHDの動画をアップロードできる「みてね」はかなり助かっています。
引用: https://mitene.us/premium
毎月届く1秒動画も、その月のダイジェスト動画が自動的に作られるのでいつも楽しみにしています。
子供の行事の動画などは長くなりがちで30分以上の動画になることもしばしばあります。
そうなるとみてねに上げるには分割しなければなりません。
スマホのアプリで動画を分割するものがあればそちらを使えば良いですが、MicroSDに保存したりしているとパソコンから分割する必要もあると思います。
今回はffmpegを使って動画を10分刻みにしつつ、exiftoolで動画の時間を1秒ずつずらしてみてねにアップするときに分割した動画の順番を担保できるようにしました。
分割したい動画ファイルと一緒に下記バッチファイルを配置して、bash [バッチファイル名].sh
で実行可能です。
処理速度は50分ほどの動画ですが、私の古いMacbook Proでも数秒で終わりました。(アプリでスマホからやろうとすると処理に20~30分かかると思います。)
#!/bin/bash
set -e # エラーが発生した時点でスクリプトを停止
# 入力ファイルと分割時間の設定
input_file="sport_1005.mp4"
duration=600 # 分割単位: 10分(600秒)、2分 (120秒)
# ffmpegのパスを設定
ffmpeg="/Applications/ffmpeg"
# 動画全体の長さを取得 (秒単位)、小数点以下を切り上げ
total_duration=$("$ffmpeg" -i "$input_file" 2>&1 | grep "Duration" | awk '{print $2}' | tr -d , | awk -F: '{ printf "%.0f", ($1 * 3600) + ($2 * 60) + $3 }')
# 分割数を計算(切り上げ)
num_splits=$(( (total_duration + duration - 1) / duration ))
echo "総再生時間: $total_duration 秒"
echo "分割数: $num_splits"
for ((i=0; i<num_splits; i++)); do
output_file="output$((i+1)).mp4"
start_time=$((i * duration))
# 開始時間を計算
start_time_formatted=$(printf "%02d:%02d:%02d" $((start_time/3600)) $(((start_time%3600)/60)) $((start_time%60)))
# 残り時間を計算
remaining_time=$((total_duration - start_time))
if [ $remaining_time -lt $duration ]; then
current_duration=$remaining_time
else
current_duration=$duration
fi
# ffmpeg コマンドでファイルを分割
"$ffmpeg" -i "$input_file" -ss "$start_time_formatted" -t "$current_duration" -c copy "$output_file"
echo "Created $output_file (開始時間: $start_time_formatted, 長さ: $current_duration 秒)"
done
echo "分割完了"
# ===== 作成日時を変更する部分 =====
counter=0 # 秒数カウンター
base_time="2024:10:05 23:59:00"
for ((i=0; i<num_splits; i++)); do
output_file="output$((i+1)).mp4"
# 1秒ずつずらすため、base_time に counter 秒を加算
adjusted_time=$(date -j -v+${counter}S -f "%Y:%m:%d %H:%M:%S" "${base_time}" "+%Y:%m:%d %H:%M:%S")
# exiftool を使って作成日(AllDates)を設定
exiftool -AllDates="$adjusted_time" -overwrite_original "$output_file"
echo "Updated $output_file with AllDates: $adjusted_time"
# カウンターを1秒増やす
counter=$((counter + 1))
done
echo "作成日時の変更が完了しました"
ほぼ自分の備忘録のためにやってますが、誰かの役にも立ててればいいなと思っています。