Spaces:
Sleeping
Sleeping
import gradio as gr | |
import tempfile | |
import os | |
import ffmpeg # より正確なメタデータ取得のため | |
def get_duration(file_path): | |
"""ffprobe を使って正確な動画長を取得""" | |
try: | |
probe = ffmpeg.probe(file_path) | |
video_streams = [stream for stream in probe['streams'] if stream['codec_type'] == 'video'] | |
if not video_streams: | |
return None | |
return float(video_streams[0]['duration']) | |
except Exception as e: | |
return None | |
def calculate_speedup(video1_bytes, video2_bytes): | |
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as temp1, \ | |
tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as temp2: | |
temp1.write(video1_bytes) | |
temp2.write(video2_bytes) | |
temp1_path = temp1.name | |
temp2_path = temp2.name | |
try: | |
duration1 = get_duration(temp1_path) | |
duration2 = get_duration(temp2_path) | |
if duration1 is None or duration2 is None: | |
return "エラー: 動画の再生時間を取得できませんでした。" | |
if duration2 == 0: | |
return "エラー: 2つ目の動画の長さが 0 秒です。" | |
speed = duration1 / duration2 | |
return f"動画2は動画1の約 {speed} 倍速です。" | |
finally: | |
os.remove(temp1_path) | |
os.remove(temp2_path) | |
# Gradio UI | |
demo = gr.Interface( | |
fn=calculate_speedup, | |
inputs=[ | |
gr.File(label="動画1(元動画)", type="binary"), | |
gr.File(label="動画2(倍速動画)", type="binary") | |
], | |
outputs="text", | |
title="精密!動画倍速計算ツール", | |
description="2つの動画の長さから、2つ目の動画が何倍速かを小数第4位まで正確に計算します。" | |
) | |
if __name__ == "__main__": | |
demo.launch() | |