import gradio as gr from fastapi import FastAPI, Request from starlette.responses import JSONResponse import subprocess import uvicorn import threading # Inicializar la aplicación FastAPI app = FastAPI() # Estado para almacenar el proceso de FFmpeg app.state.ffmpeg_process = None # Función para iniciar FFmpeg def start_ffmpeg(rtmp_server, stream_key): # Comando FFmpeg para recibir video desde stdin y transmitir a RTMP command = [ "ffmpeg", "-re", "-i", "-", # Leer desde stdin "-c:v", "libx264", "-b:v", "1000k", "-f", "flv", f"{rtmp_server}/{stream_key}" ] process = subprocess.Popen(command, stdin=subprocess.PIPE) return process # Ruta de FastAPI para recibir el stream de video @app.post("/save_stream") async def save_stream(request: Request): data = await request.body() if app.state.ffmpeg_process: try: app.state.ffmpeg_process.stdin.write(data) app.state.ffmpeg_process.stdin.flush() except BrokenPipeError: return JSONResponse({"status": "ffmpeg process not available"}, status_code=500) return JSONResponse({"status": "ok"}) # Función de Gradio para iniciar la transmisión def start_streaming(rtmp_server, stream_key): if app.state.ffmpeg_process is None: process = start_ffmpeg(rtmp_server, stream_key) app.state.ffmpeg_process = process return "Transmisión en vivo iniciada" else: return "La transmisión ya está en curso" # Crear la interfaz de Gradio with gr.Blocks() as demo: gr.Markdown("# Transmisión en Vivo") with gr.Row(): rtmp_server = gr.Textbox(label="Servidor RTMP (YouTube, Twitch, etc.)", placeholder="rtmp://servidor/live", lines=1) stream_key = gr.Textbox(label="Clave de transmisión", placeholder="Ingresa tu clave de transmisión", type="password", lines=1) start_button = gr.Button("Iniciar Transmisión") output = gr.Textbox(label="Estado", interactive=False) start_button.click(start_streaming, inputs=[rtmp_server, stream_key], outputs=output) # Agregar HTML y JavaScript para capturar la pantalla gr.HTML(""" """) # Montar la aplicación de Gradio en FastAPI app = gr.mount_gradio_app(app, demo, path="/") # Ejecutar la aplicación con Uvicorn if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=7860)