ChatGPTにタイムラプス動画用のコンバータ(静止画←→動画)を作ってもらいました。
複数の静止画から動画を生成する場合と、逆に動画から静止画を連番で取り出すコードの2種類です。
指示文(プロンプト)1:
複数の静止画像からタイムラプス動画を生成するpythonプログラムを提示してください。MoviePyを利用してください。動画のサイズ(縦、横)、フレームレートも指定できるようにしてください。読み込む静止画像のフォルダも指定できるようにしてください。
回答:
以下は、指定されたフォルダ内の静止画像からタイムラプス動画を生成するPythonプログラムです。必要に応じて動画のサイズやフレームレートを指定できます。
from moviepy.editor import ImageSequenceClip
def create_timelapse(image_folder, output_path, size=(640, 360), fps=24):
# Load the images from the folder
image_files = sorted(os.listdir(image_folder))
images = [os.path.join(image_folder, f) for f in image_files if f.endswith(".png")]
# Create the image sequence clip
clip = ImageSequenceClip(images, fps=fps)
# Resize the clip to the specified size
clip = clip.resize(size)
# Write the clip to a video file
clip.write_videofile(output_path)
# Example usage:
image_folder = "path/to/image/folder"
output_path = "path/to/output/video.mp4"
size = (640, 360)
fps = 24
create_timelapse(image_folder, output_path, size, fps)
このプログラムでは、ImageSequenceClipを使用して静止画像のシーケンスを読み込みます。その後、resizeメソッドを使用して動画のサイズを変更し、write_videofileメソッドを使用して出力ファイルに書き込みます。
結果:
下記のように成功しました。素材は下記のサイトから借りてます。
タイムラプスモードで夜明けから夕暮れまで · 無料の動画素材 (pexels.com)
指示文(プロンプト)2:
動画から連続した静止画像を生成するpythonプログラムを提示してください。MoviePyを利用してください。動画のサイズ(縦、横)、フレームレートも指定できるようにしてください。
回答:
以下は、MoviePyを使用して動画から静止画像を生成するPythonプログラムの例です。このプログラムは、指定された動画ファイルから指定された数のフレームを取得し、それらのフレームを静止画像として保存します。
from moviepy.editor import VideoFileClip
from PIL import Image
def extract_frames(video_path, num_frames, output_path, size=(640, 360), fps=24):
# Load the video clip
clip = VideoFileClip(video_path)
# Resize the clip to the specified size
clip = clip.resize(size)
# Set the frame rate of the clip
clip = clip.set_fps(fps)
# Iterate over the frames and extract them
for i, frame in enumerate(clip.iter_frames()):
if i >= num_frames:
break
output_file = f"{output_path}/frame_{i:05d}.png"
frame_image = Image.fromarray(frame)
frame_image.save(output_file)
# Close the clip
clip.close()
# Example usage:
video_path = "path/to/video.mp4"
num_frames = 10
output_path = "path/to/output/folder"
size = (640, 360)
fps = 24
extract_frames(video_path, num_frames, output_path, size, fps)
このプログラムでは、VideoFileClipを使用して指定された動画ファイルを読み込み、resizeおよびset_fpsを使用して、指定されたサイズとフレームレートにリサイズおよび変換します。その後、iter_framesを使用してフレームに反復処理し、Image.fromarrayを使用してNumPy配列をPIL画像に変換し、saveを使用して静止画像として保存します。
このプログラムを使用する場合は、video_path、num_frames、output_path、size、fpsを指定する必要があります。 video_pathは、変換する動画ファイルのパスを指定します。num_framesは、取得するフレーム数を指定します。 output_pathは、生成された静止画像を保存するフォルダのパスを指定します。sizeは、出力画像のサイズを指定します。 fpsは、出力画像のフレームレートを指定します。
結果:
成功しました。元となる動画を指定してパラメータを調整して実行すると、以下のように大量の静止画が得られます。
フレーム単位でコマをカットしたり追加をしたかったので。動画編集ソフトを使えば良いだけなのですが。。。