PythonとMoviePyで動画ファイルの指定時間ごとの分割を自動化
PythonとMoviePyで動画ファイルの指定時間ごとの分割を自動化 OpenCVなどで動画の処理を行う際に、1分毎の変化や10分毎に結果を見たいときに一連の動画から指定した時間毎に分割して切り出したいことがあります。 […]
Filter by Category
PythonとMoviePyで動画ファイルの指定時間ごとの分割を自動化 OpenCVなどで動画の処理を行う際に、1分毎の変化や10分毎に結果を見たいときに一連の動画から指定した時間毎に分割して切り出したいことがあります。 […]
OpenCVで動画ファイルの最終フレームを取得 PythonとOpenCVを使用して動画ファイルの最大フレーム数を取得する方法を解説をします。処理の確認用に取得した最大フレーム数とファイル名をソートして表示させます。 コ […]
Amazon Route 53で新規ドメインを登録 ウェブサイトやウェブサービスを運営する際にドメインは欠かせない要素です。この記事では、Amazon Route 53で新しいドメインを登録する方法について解説します。 […]
GitHub CopilotをPyCharmで使用するまでの手順 GitHub Copilotは、プログラミングの効率を飛躍的に向上させるツールで、開発者にとって非常に便利なコーディングのサポートを提供します。本記事では […]
PyCharm 2023.2から追加されたBlackによるコード成形 Pythonのコード成形で人気のBlackがPyCharm 2023.2から環境設定画面で設定可能になりました。従来はpipなどでインストールしていま […]
S3のライフサイクルルールの落とし穴 保存したデータが必要以上に増えないようにライフサイクルルールで指定した日数を経過したデータは削除する設定にしていましたが、後日改めてバケットを確認するとフォルダ、ファイルどちらも削除 […]
S3でストレージクラスを一括で変更 デフォルトではS3のストレージクラスは「標準」になっていますが、このストレージクラスは頻繁にアクセスするデータを保存するのに適した設定なので、バックアップファイルなどの頻繁にアクセスし […]
request.FILES.get(‘file’)とrequest.FILES[‘file’] の違い この記事は生成AIで作成されました request.FILES.ge […]
Twitter APIの変更に関して 最近、Twitter APIのバージョンがアップデートされ、v1が廃止されました。これに伴い、開発者はv2への移行が必要となります。 Twitter v1の廃止 Twitter v1 […]
AWS Rekognitionとは AWS Rekognitionは、画像と動画から情報を抽出するディープラーニング技術を利用した分析サービスです。このサービスは、顔認識、物体検出、シーン分析など、さまざまな分析機能を提 […]
タイプヒント, コメント, ドックストリングの追記とGitHubでのコンフリクト コメントの記述方法と注意点 タイプヒントの記述方法と注意点 ドックストリングの記述方法と注意点 GitHubのコンフリクト発生時の対処法に […]
VSCodeとGitでのコード管理 行ったこと アクセストークンの取得リポジトリのクローン リポジトリのクローン ブランチの作成 ファイルのコミット 同期 ターミナルでのgitbashの利用(windows) 作業用のブ […]
vue createで作成する際に.gitが生成されないようにする Vue.jとDjangoのプロジェクトをGitで管理しようとしたところ、vue createで生成したディレクトリだけが追加されていないことがわかりまし […]
Vue.jsとDjango REST Frameworkで画面が真っ白になる原因〜2〜 Django REST Frameworkと組み合わせたVue.jsで、ビルド後にバックエンドの開発サーバー(8000ポートなど)で […]
Vue.jsとDjango REST Frameworkで画面が真っ白になる原因〜1〜 画面が真っ白になる原因 Vue.jsとDjangoの組み合わせで開発中にnpm run serveで起動した開発サーバーでページを確 […]
Vue.jsとDjango REST FrameworkでSPA構築〜後半〜 前半に続き、後半はフロントエンド側(Vue.js)の実装を進めていきます。 コードはGitHubリポジトリにあげています。 開発環境 PC: […]
Vue.jsとDjango REST FrameworkでSPA構築〜前半〜 Vue.jsとFlaskの連携に続き、今回はVue.jsとDjango(Django REST Framework)の連携を解説します。チュー […]
.gitignoreには書かずに自分の環境だけファイルを管理から外す Gitでは管理から外すファイルを指定するには、.gitignoreファイルを使用します。これは、Gitが無視するべきファイルやディレクトリのリストを書 […]
Flaskで開発サーバーを起動する時のTips Flaskで開発中にflask runコマンドでサーバーを起動した際に以下の表示が出る場合があります。この表示は.envもしくは.flaskenvがあってもpython-d […]
PyCharmで.envから環境変数を読み込む 環境変数を.envに書いて読み込ませる理由 Pythonの開発では、セキュリティや環境毎の設定、柔軟性などの理由から.envファイルに環境変数を書いて読み込ませる方法が推奨 […]
OpenCVなどで動画の処理を行う際に、1分毎の変化や10分毎に結果を見たいときに一連の動画から指定した時間毎に分割して切り出したいことがあります。動画編集ソフトを使っても良いですが動画の切り出しという単調な作業の繰り返しで人的ミスも発生しやすくなるため、できれば自動化させたい処理の一つです。本記事では動画の分割作業をPythonとMoviePyで自動化する方法を解説します。
コードはGitHubリポジトリにあげています。
PC: MacBook Pro (14, 2021)
OS: macOS Monterey 12.0.1
Python: 3.9.1
moviepy: 1.0.3
import os
import glob
import sys
from moviepy.video.io.VideoFileClip import VideoFileClip
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
def split_video(file_path: str, duration: int) -> None:
# ファイル名から拡張子を取得
file_name, file_extension = os.path.splitext(os.path.basename(file_path))
# 分割したビデオの保存先ディレクトリを作成
output_dir = f"{file_name}_split"
os.makedirs(output_dir, exist_ok=True)
# 動画の長さを取得し、動画ファイルを適切に閉じる
with VideoFileClip(file_path) as video:
total_duration = int(video.duration)
# 指定した間隔でビデオを分割
start_time = 0
end_time = duration
while start_time < total_duration:
# 実際の終了時間が動画の総時間を超えないように調整
end_time = min(end_time, total_duration)
# 分割範囲を指定してビデオを切り出し
output_path = os.path.join(output_dir, f"{file_name}_{start_time}_{end_time}{file_extension}")
ffmpeg_extract_subclip(file_path, start_time, end_time, targetname=output_path)
# 次の分割範囲を更新
start_time += duration
end_time = start_time + duration
def split_videos_in_directory(directory: str, duration: int) -> None:
# ディレクトリ内のすべてのMP4ファイルを取得
video_files = glob.glob(os.path.join(directory, "*.mp4"))
for video_file in video_files:
# 動画ファイル毎に分割処理
split_video(video_file, duration)
# メイン処理
if __name__ == "__main__":
if len(sys.argv) < 2:
print("ディレクトリパスを引数として指定してください。")
sys.exit(1)
directory_path = sys.argv[1]
if not os.path.isdir(directory_path):
print("指定されたパスはディレクトリではありません。")
sys.exit(1)
# コマンドライン引数からdurationを取得し、指定がない場合は600秒をデフォルト値とする
try:
duration = int(sys.argv[2]) if len(sys.argv) > 2 else 600
except ValueError:
print("Durationは整数である必要があります。")
sys.exit(1)
split_videos_in_directory(directory_path, duration)
コードの量が少し多いですが大きく分けると以下の3つの処理に分けられます。
import os
import glob
import sys
from moviepy.video.io.VideoFileClip import VideoFileClip
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
ライブラリ、モジュールのインポート
def split_video(file_path: str, duration: int) -> None:
# ファイル名から拡張子を取得
file_name, file_extension = os.path.splitext(os.path.basename(file_path))
# 分割したビデオの保存先ディレクトリを作成
output_dir = f"{file_name}_split"
os.makedirs(output_dir, exist_ok=True)
# 動画の長さを取得し、動画ファイルを適切に閉じる
with VideoFileClip(file_path) as video:
total_duration = int(video.duration)
# 指定した間隔でビデオを分割
start_time = 0
end_time = duration
while start_time < total_duration:
# 実際の終了時間が動画の総時間を超えないように調整
end_time = min(end_time, total_duration)
# 分割範囲を指定してビデオを切り出し
output_path = os.path.join(output_dir, f"{file_name}_{start_time}_{end_time}{file_extension}")
ffmpeg_extract_subclip(file_path, start_time, end_time, targetname=output_path)
# 次の分割範囲を更新
start_time += duration
end_time = start_time + duration
取得したファイルを指定した時間毎に分割して保存する関数
def split_videos_in_directory(directory: str, duration: int) -> None:
# ディレクトリ内のすべてのMP4ファイルを取得
video_files = glob.glob(os.path.join(directory, "*.mp4"))
for video_file in video_files:
# 動画ファイル毎に分割処理
split_video(video_file, duration)
ディレクトリ内のファイル(mp4のみ)を取得して処理する関数
取得したファイルを1件づつ先述の動画を分割する関数に渡す
# メイン処理
if __name__ == "__main__":
if len(sys.argv) < 2:
print("ディレクトリパスを引数として指定してください。")
sys.exit(1)
directory_path = sys.argv[1]
if not os.path.isdir(directory_path):
print("指定されたパスはディレクトリではありません。")
sys.exit(1)
# コマンドライン引数からdurationを取得し、指定がない場合は600秒をデフォルト値とする
try:
duration = int(sys.argv[2]) if len(sys.argv) > 2 else 600
except ValueError:
print("Durationは整数である必要があります。")
sys.exit(1)
split_videos_in_directory(directory_path, duration)
引数にはディレクトリのパスと分割する時間をフレームレートで指定
フレームレートの指定がない場合は600フレームを指定(30フレームの動画の場合10分)
ディレクトリのパスとフレームレートに異常がある場合はエラーを発生させる
群馬県でPythonを使ったAIやソフトウェアを開発している株式会社ファントムが運営しています。
メーリングリストに登録するとファントムの最新情報をお届けします
お客様のメールアドレスを共有することはありません