群馬県でPythonを使ったAIやシステムを開発しているファントム

Navigation
群馬県でPythonを使ったAIやシステムを開発しているファントム

群馬県でPythonを使ったAIやシステムを開発しているファントムです。企業の経営課題を最適なテクノロジーで解決します。テックブログではPythonを中心にプログラミングに役立つ情報を発信しています。

投稿を検索する


  • 株式会社ファントム コーポレートサイト

カテゴリー



  • AWS 16
  • Django 45
  • FastAPI 4
  • Flask 8
  • GCP 1
  • Information 37
  • Other 32
  • PHP 2
  • Python 93
  • Pythonista 3
  • Rust 1

タグ


Alembic API argparse Beautiful Soup black Channels charset CodeCommit datetime Django REST framework Docker enumerate f-string git GitHub glob Google Colaboratory i18n IAM Internship Jupyter Lambda Matplotlib Nginx OpenCV pandas PIL Pillow PostgreSQL PyCharm PyCon pyenv PyTorch Redis Rembg ReportLab requests S3 Sentry slack tqdm uWSGI venv Vue.js youtube
このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシーと利用規約が適用されます。

© 2022 Fantom, Inc.

Hydra WordPress Theme by EckoThemes.

Published with WordPress.

Related Articles

Filter by Category

  • Python(93)
  • Django(45)
  • Information(37)
  • Other(32)
  • AWS(16)
  • Flask(8)
  • FastAPI(4)
  • Pythonista(3)
  • PHP(2)
  • GCP(1)
  • Rust(1)

Filter by Author

  • EIGHT (14)
  • hayai017 (2)
  • press (196)
Back to Latest Articles
Python

PythonとMoviePyで動画ファイルの指定時間ごとの分割を自動化

PythonとMoviePyで動画ファイルの指定時間ごとの分割を自動化 OpenCVなどで動画の処理を行う際に、1分毎の変化や10分毎に結果を見たいときに一連の動画から指定した時間毎に分割して切り出したいことがあります。 […]

Posted on 20th 11月 2023 by press

Python

OpenCVで動画ファイルの最終フレームを取得

OpenCVで動画ファイルの最終フレームを取得 PythonとOpenCVを使用して動画ファイルの最大フレーム数を取得する方法を解説をします。処理の確認用に取得した最大フレーム数とファイル名をソートして表示させます。 コ […]

Posted on 6th 11月 2023 by press

AWS

Amazon Route 53で新規ドメインを登録

Amazon Route 53で新規ドメインを登録 ウェブサイトやウェブサービスを運営する際にドメインは欠かせない要素です。この記事では、Amazon Route 53で新しいドメインを登録する方法について解説します。 […]

Posted on 19th 10月 2023 by press

Other

GitHub CopilotをPyCharmで使用するまでの手順

GitHub CopilotをPyCharmで使用するまでの手順 GitHub Copilotは、プログラミングの効率を飛躍的に向上させるツールで、開発者にとって非常に便利なコーディングのサポートを提供します。本記事では […]

Posted on 17th 10月 2023 by press

Python

PyCharm 2023.2から追加されたBlackによるコード成形

PyCharm 2023.2から追加されたBlackによるコード成形 Pythonのコード成形で人気のBlackがPyCharm 2023.2から環境設定画面で設定可能になりました。従来はpipなどでインストールしていま […]

Posted on 13th 9月 2023 by press

AWS

S3のライフサイクルルールの落とし穴

S3のライフサイクルルールの落とし穴 保存したデータが必要以上に増えないようにライフサイクルルールで指定した日数を経過したデータは削除する設定にしていましたが、後日改めてバケットを確認するとフォルダ、ファイルどちらも削除 […]

Posted on 10th 9月 2023 by press

AWS

S3でストレージクラスを一括で変更

S3でストレージクラスを一括で変更 デフォルトではS3のストレージクラスは「標準」になっていますが、このストレージクラスは頻繁にアクセスするデータを保存するのに適した設定なので、バックアップファイルなどの頻繁にアクセスし […]

Posted on 10th 9月 2023 by press

Django

request.FILES.get(‘file’)とrequest.FILES[‘file’] の違い

request.FILES.get(‘file’)とrequest.FILES[‘file’] の違い この記事は生成AIで作成されました request.FILES.ge […]

Posted on 21st 5月 2023 by press

Other

Twitter APIの移行作業について

Twitter APIの変更に関して 最近、Twitter APIのバージョンがアップデートされ、v1が廃止されました。これに伴い、開発者はv2への移行が必要となります。 Twitter v1の廃止 Twitter v1 […]

Posted on 6th 5月 2023 by EIGHT

AWS

AWS Rekognitionとは

AWS Rekognitionとは AWS Rekognitionは、画像と動画から情報を抽出するディープラーニング技術を利用した分析サービスです。このサービスは、顔認識、物体検出、シーン分析など、さまざまな分析機能を提 […]

Posted on 5th 5月 2023 by EIGHT

Other

コメント,タイプヒント, ドックストリングの追記とGitHubでのコンフリクト

タイプヒント, コメント, ドックストリングの追記とGitHubでのコンフリクト コメントの記述方法と注意点 タイプヒントの記述方法と注意点 ドックストリングの記述方法と注意点 GitHubのコンフリクト発生時の対処法に […]

Posted on 18th 4月 2023 by hayai017

Other

VSCodeとGitでのコード管理

VSCodeとGitでのコード管理 行ったこと アクセストークンの取得リポジトリのクローン リポジトリのクローン ブランチの作成 ファイルのコミット 同期 ターミナルでのgitbashの利用(windows) 作業用のブ […]

Posted on 18th 4月 2023 by hayai017

Other

vue createで作成する際に.gitが生成されないようにする

vue createで作成する際に.gitが生成されないようにする Vue.jとDjangoのプロジェクトをGitで管理しようとしたところ、vue createで生成したディレクトリだけが追加されていないことがわかりまし […]

Posted on 3rd 4月 2023 by press

Django

Vue.jsとDjango REST Frameworkで画面が真っ白になる原因〜2〜

Vue.jsとDjango REST Frameworkで画面が真っ白になる原因〜2〜 Django REST Frameworkと組み合わせたVue.jsで、ビルド後にバックエンドの開発サーバー(8000ポートなど)で […]

Posted on 3rd 4月 2023 by press

Django

Vue.jsとDjango REST Frameworkで画面が真っ白になる原因〜1〜

Vue.jsとDjango REST Frameworkで画面が真っ白になる原因〜1〜 画面が真っ白になる原因 Vue.jsとDjangoの組み合わせで開発中にnpm run serveで起動した開発サーバーでページを確 […]

Posted on 3rd 4月 2023 by press

Django

Vue.jsとDjango REST FrameworkでSPA構築〜後半〜

Vue.jsとDjango REST FrameworkでSPA構築〜後半〜 前半に続き、後半はフロントエンド側(Vue.js)の実装を進めていきます。 コードはGitHubリポジトリにあげています。 開発環境 PC: […]

Posted on 2nd 4月 2023 by press

Django

Vue.jsとDjango REST FrameworkでSPA構築〜前半〜

Vue.jsとDjango REST FrameworkでSPA構築〜前半〜 Vue.jsとFlaskの連携に続き、今回はVue.jsとDjango(Django REST Framework)の連携を解説します。チュー […]

Posted on 2nd 4月 2023 by press

Other

.gitignoreには書かずに自分の環境だけファイルを管理から外す

.gitignoreには書かずに自分の環境だけファイルを管理から外す Gitでは管理から外すファイルを指定するには、.gitignoreファイルを使用します。これは、Gitが無視するべきファイルやディレクトリのリストを書 […]

Posted on 1st 4月 2023 by press

Flask

Flaskで開発サーバーを起動する時のTips

Flaskで開発サーバーを起動する時のTips Flaskで開発中にflask runコマンドでサーバーを起動した際に以下の表示が出る場合があります。この表示は.envもしくは.flaskenvがあってもpython-d […]

Posted on 1st 3月 2023 by press

Python

PyCharmで.envから環境変数を読み込む

PyCharmで.envから環境変数を読み込む 環境変数を.envに書いて読み込ませる理由 Pythonの開発では、セキュリティや環境毎の設定、柔軟性などの理由から.envファイルに環境変数を書いて読み込ませる方法が推奨 […]

Posted on 1st 3月 2023 by press

View Latest Posts
Python

PythonとMoviePyで動画ファイルの指定時間ごとの分割を自動化


press
PythonとMoviePyで動画ファイルの指定時間ごとの分割を自動化
Posted on 20th 11月 2023 by press
2024年度 インターンシップ 募集開始

PythonとMoviePyで動画ファイルの指定時間ごとの分割を自動化

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つの処理に分けられます。

  1. 動画を指定した時間毎に分割
  2. ディレクトリから動画ファイルを取得
  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分)
ディレクトリのパスとフレームレートに異常がある場合はエラーを発生させる

ファントムYouTubeチャンネル

株式会社ファントムへのお問い合わせ

群馬県でPythonを使ったAIやソフトウェアを開発している株式会社ファントムが運営しています。




    press
    • glob
    • MoviePy
    • sys
    • Share Article:
    • Twitter
    • Facebook
    • Pinterest
    • LinkedIn
    • Reddit

    Related Articles

    Django

    ダウンロードするファイルの文字コードを動的に変更

    ダウンロードするファイルの文字コードを動的に変更 ウェブアプリケーションの中でCSVやテキストファイルをダウンロードさせた時に文字化けが発生する事があります。使用する文字コードが決まっていれば予め固定してしまう事で文字化 […]

    Posted on 2nd 12月 2019 by press
    Django

    WARNING: `pyenv init -` no longer sets PATH.

    WARNING: `pyenv init -` no longer sets PATH. pyenvが入っているzsh環境(Mac)でターミナルの起動時に以下のエラーが出るようになりました。今回はDjangoのプロジェク […]

    Posted on 6th 6月 2021 by press