Spaces:
Running
Running
import gradio as gr | |
from PIL import Image, ImageSequence | |
from moviepy.editor import VideoFileClip | |
def edit_file(file, loop_count, speed_factor, frame_skip): | |
file_name = file.name.split("/")[-1] # 元ファイル名を取得 | |
base_name = file_name.rsplit(".", 1)[0] # 拡張子を除いた部分 | |
# ファイルがGIFか動画か判定 | |
if file.name.endswith((".mp4", ".avi", ".mov", ".mkv")): | |
# 動画をGIFに変換 | |
clip = VideoFileClip(file.name) | |
gif_path = f"{base_name}.gif" | |
clip.write_gif(gif_path, fps=10) | |
gif = Image.open(gif_path) | |
else: | |
gif = Image.open(file.name) | |
# GIF編集処理 | |
frames = [] | |
durations = [] | |
for i, frame in enumerate(ImageSequence.Iterator(gif)): | |
if i % frame_skip != 0: # フレームスキップ | |
continue | |
frames.append(frame.copy()) | |
durations.append(gif.info.get("duration", 100) // speed_factor) | |
# 保存先をアップロードされたファイル名ベースに | |
output_path = f"{base_name}_edited.gif" | |
frames[0].save( | |
output_path, | |
save_all=True, | |
append_images=frames[1:], | |
loop=loop_count, | |
duration=durations, | |
disposal=2 | |
) | |
return output_path, output_path # プレビュー表示用に同じパスを返す | |
# Gradioインターフェース | |
interface = gr.Interface( | |
fn=edit_file, | |
inputs=[ | |
gr.File(label="GIFまたは動画をアップロード"), | |
gr.Number(label="ループ回数(0は無限ループ)", value=0), | |
gr.Number(label="再生速度の倍率(例: 2は2倍速)", value=1), | |
gr.Number(label="フレームスキップ数", value=1), | |
], | |
outputs=[ | |
gr.File(label="ダウンロードリンク"), | |
gr.Image(label="プレビュー", type="file") | |
] | |
) | |
interface.launch() | |