//AdSenseにリンク

動画を指定のアスペクト比にトリミングして、指定の拡張子で書き出すpython

仕様

動画のアスペクト比を9:16にトリミングするためのPythonコードを以下に示します。このコードは、指定されたフォルダ内のすべての動画ファイルに対して実行されます。

元動画の中心部分で9:16を切り抜きます。

元の動画ファイルの拡張子に関係なく、出力ファイルは常に.mp4形式となります。output_filename変数を使用して、出力ファイル名を生成し、拡張子を.mp4に変更しています。

このスクリプトは、以下の手順で動作します

  1. 入力ディレクトリ内のすべての動画ファイルを読み込みます。
  2. 各動画ファイルについて、動画の幅と高さを取得します。
  3. 9:16のアスペクト比に基づいて、中央でトリミングするための新しい幅と高さ、およびオフセットを計算します。
  4. 新しいアスペクト比にトリミングされたフレームを作成し、出力ディレクトリに保存します。

コード

import os
import cv2

def crop_to_aspect_ratio(input_dir, output_dir, aspect_ratio=(9, 16)):
    if not os.path.exists(input_dir):
        raise FileNotFoundError(f"Input directory '{input_dir}' does not exist.")

    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for filename in os.listdir(input_dir):
        if filename.endswith(('.mp4', '.avi', '.mov')):
            filepath = os.path.join(input_dir, filename)
            cap = cv2.VideoCapture(filepath)

            if not cap.isOpened():
                print(f"Error opening video file {filename}")
                continue

            frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
            frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
            target_aspect_ratio = aspect_ratio[0] / aspect_ratio[1]

            if frame_width / frame_height > target_aspect_ratio:
                new_width = int(frame_height * target_aspect_ratio)
                new_height = frame_height
                x_offset = (frame_width - new_width) // 2
                y_offset = 0
            else:
                new_width = frame_width
                new_height = int(frame_width / target_aspect_ratio)
                x_offset = 0
                y_offset = (frame_height - new_height) // 2

            # 出力ファイル名を設定し、拡張子をmp4にする
            output_filename = os.path.splitext(filename)[0] + '.mp4'
            output_filepath = os.path.join(output_dir, output_filename)
            
            fourcc = cv2.VideoWriter_fourcc(*'mp4v')
            out = cv2.VideoWriter(output_filepath, fourcc, cap.get(cv2.CAP_PROP_FPS), (new_width, new_height))

            while True:
                ret, frame = cap.read()
                if not ret:
                    break
                cropped_frame = frame[y_offset:y_offset+new_height, x_offset:x_offset+new_width]
                out.write(cropped_frame)

            cap.release()
            out.release()
            print(f"Processed {filename}")

input_directory = '/path/to/movie/folder'  # ここに正しいパスを設定してください
output_directory = '/path/to/output/folder'  # ここに正しいパスを設定してください
crop_to_aspect_ratio(input_directory, output_directory)