import gradio as gr import ffmpeg import tempfile import os def convert_webm_to_apng_with_fps(input_webm_file, fps): """ アップロードされたWEBMファイルを、指定されたFPSでAPNGに変換する関数 """ if input_webm_file is None: raise gr.Error("WEBMファイルをアップロードしてください。") input_path = input_webm_file.name with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as temp_output_file: output_path = temp_output_file.name print(f"入力ファイル: {input_path}") print(f"出力ファイル: {output_path}") print(f"指定FPS: {fps}") try: # ffmpegを使って変換処理を実行 # -r {fps}: フレームレートを指定 ( ffmpeg .input(input_path) .output(output_path, f='apng', r=fps, plays=0) # r=fps を追加 .run(overwrite_output=True, capture_stdout=True, capture_stderr=True) ) print("変換が正常に完了しました。") return output_path except ffmpeg.Error as e: print("エラー発生: ffmpegの処理に失敗しました。") print("--- stderr ---") print(e.stderr.decode()) raise gr.Error(f"変換に失敗しました: {e.stderr.decode()}") finally: pass with gr.Blocks() as demo_advanced: gr.Markdown( """ # WEBMからAPNGへの変換ツール (FPS調整機能付き) WEBM形式の動画ファイルをアップロードすると、アニメーションPNG(APNG)に変換します。 スライダーでフレームレート(FPS)を調整できます。 """ ) with gr.Row(): with gr.Column(scale=1): input_video = gr.File(label="WEBMファイルをアップロード", file_types=['.webm']) fps_slider = gr.Slider( minimum=1, maximum=60, value=24, # デフォルト値 step=1, label="フレームレート (FPS)", info="値を小さくするとファイルサイズが軽くなりますが、動きがカクカクします。" ) convert_button = gr.Button("変換する", variant="primary") with gr.Column(scale=1): output_image = gr.File(label="出力されたAPNGファイル") convert_button.click( fn=convert_webm_to_apng_with_fps, inputs=[input_video, fps_slider], # 入力をリストで渡す outputs=output_image ) if __name__ == "__main__": # 基本バージョンか応用バージョンか選んで起動してください # demo.launch() demo_advanced.launch()