自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

mp4ファイルを10分ごとに分割するスクリプトを作成

Linux

久々に記事を書きます。ヒノマルクです。

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 "作成日時の変更が完了しました"

ほぼ自分の備忘録のためにやってますが、誰かの役にも立ててればいいなと思っています。

タイトルとURLをコピーしました