動画を指定のアスペクト比にトリミングして、指定の拡張子で書き出すpython
Contents
仕様
動画のアスペクト比を9:16にトリミングするためのPythonコードを以下に示します。このコードは、指定されたフォルダ内のすべての動画ファイルに対して実行されます。
元動画の中心部分で9:16を切り抜きます。
元の動画ファイルの拡張子に関係なく、出力ファイルは常に.mp4
形式となります。output_filename
変数を使用して、出力ファイル名を生成し、拡張子を.mp4
に変更しています。
このスクリプトは、以下の手順で動作します
- 入力ディレクトリ内のすべての動画ファイルを読み込みます。
- 各動画ファイルについて、動画の幅と高さを取得します。
- 9:16のアスペクト比に基づいて、中央でトリミングするための新しい幅と高さ、およびオフセットを計算します。
- 新しいアスペクト比にトリミングされたフレームを作成し、出力ディレクトリに保存します。
コード
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)
ディスカッション
コメント一覧
まだ、コメントがありません