# 🔗 Extracción de URLs m3u8 para Streaming ## 📖 Explicación El sistema ahora está optimizado para extraer **URLs m3u8 (HLS)** directamente de YouTube, que son las URLs de manifest que contienen los segmentos del video en vivo. ### ¿Qué es m3u8? - **m3u8** es el formato de playlist de HLS (HTTP Live Streaming) - Es el formato que YouTube usa para sus transmisiones en vivo - Contiene referencias a los segmentos de video (.ts) que se van generando - Permite streaming adaptativo de calidad ### Ejemplo de URL m3u8: ``` https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1769687589/ei/xfV6abaKBNy1ir4P6e_JoQU/ip/189.197.71.6/id/G01-33V6I2g.1/itag/301/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/... ``` --- ## 🛠️ Cómo Funciona ### 1. Extracción con yt-dlp El sistema usa este comando optimizado: ```bash yt-dlp -g \ -f "best[ext=m3u8]/bestvideo[ext=m3u8]+bestaudio[ext=m3u8]/best" \ --no-warnings \ "https://www.youtube.com/watch?v=VIDEO_ID" ``` **Parámetros:** - `-g`: Obtener solo la URL (no descargar) - `-f`: Formato preferido, prioriza m3u8 - `--no-warnings`: Silencia advertencias ### 2. Streaming con FFmpeg Una vez obtenida la URL m3u8, se usa FFmpeg para retransmitir: ```bash ffmpeg -re \ -i "https://manifest.googlevideo.com/api/manifest/hls_playlist/..." \ -c copy \ -f flv \ rtmps://live-api-s.facebook.com:443/rtmp/TU-STREAM-KEY ``` **Parámetros:** - `-re`: Lee el input a velocidad nativa (real-time) - `-i`: URL m3u8 de entrada - `-c copy`: Copia los codecs sin recodificar (más rápido) - `-f flv`: Formato FLV para RTMP - `rtmps://...`: URL RTMP de destino --- ## 💡 Ventajas de Usar `-c copy` ### ✅ Beneficios: 1. **Más rápido**: No hay recodificación, solo copia 2. **Menos CPU**: No requiere procesamiento pesado 3. **Sin pérdida de calidad**: El video mantiene su calidad original 4. **Menor latencia**: La transmisión es casi instantánea ### ⚠️ Consideraciones: - Los codecs del origen deben ser compatibles con RTMP - YouTube usa H.264 (video) y AAC (audio), compatibles con RTMP - Si hay problemas de compatibilidad, se puede usar recodificación: ```bash ffmpeg -re -i "URL_M3U8" \ -c:v libx264 -preset veryfast -b:v 4000k \ -c:a aac -b:a 128k \ -f flv rtmp://destino ``` --- ## 🚀 Uso en el Panel Web ### Automático: 1. **Busca un video** en la pestaña 🔍 Búsqueda 2. El sistema extrae automáticamente la URL m3u8 3. En la pestaña 🎛️ Control verás: "✅ Stream listo para transmitir" 4. Expande **"🔗 Ver URL m3u8 del Stream"** para ver la URL extraída 5. Inicia las transmisiones con los botones ▶️ ### Manual con el Script de Prueba: ```bash python3 test_m3u8_extraction.py "https://www.youtube.com/watch?v=VIDEO_ID" ``` Esto te mostrará: - La URL m3u8 extraída - Un comando FFmpeg de ejemplo - Información de debug --- ## 📋 Ejemplo Completo ### Paso 1: Obtener URL m3u8 ```bash yt-dlp -g -f "best[ext=m3u8]/best" \ "https://www.youtube.com/watch?v=dQw4w9WgXcQ" ``` **Resultado:** ``` https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/... ``` ### Paso 2: Transmitir a Facebook ```bash ffmpeg -re \ -i "https://manifest.googlevideo.com/api/manifest/hls_playlist/..." \ -c copy \ -f flv \ rtmps://live-api-s.facebook.com:443/rtmp/FB-122251731062035477-0-Ab4EnDtzXqSSJgDCAl-tMyWX ``` ### Paso 3: Transmitir a Múltiples Plataformas El panel web hace esto automáticamente, ejecutando procesos FFmpeg separados para cada plataforma. --- ## 🔧 Configuración Avanzada ### Ajustar Formato de Extracción Edita en `streamlit_app.py` la función `get_stream_url()`: **Para mejor calidad:** ```python "-f", "best[ext=m3u8]" ``` **Para calidad específica:** ```python "-f", "bestvideo[height<=1080][ext=m3u8]+bestaudio[ext=m3u8]/best" ``` **Para menor calidad (menos ancho de banda):** ```python "-f", "worstvideo[ext=m3u8]+worstaudio[ext=m3u8]/worst" ``` ### Ajustar Comando FFmpeg Edita en `streamlit_app.py` la función `start_ffmpeg_stream()`: **Con recodificación:** ```python command = [ "ffmpeg", "-re", "-i", source_url, "-c:v", "libx264", "-preset", "veryfast", "-b:v", "4000k", "-maxrate", "4000k", "-bufsize", "8000k", "-c:a", "aac", "-b:a", "128k", "-f", "flv", full_rtmp ] ``` **Con filtros de video:** ```python command = [ "ffmpeg", "-re", "-i", source_url, "-vf", "scale=1280:720", # Escalar a 720p "-c:v", "libx264", "-preset", "veryfast", "-b:v", "2500k", "-c:a", "aac", "-b:a", "128k", "-f", "flv", full_rtmp ] ``` --- ## 🧪 Pruebas ### Probar Extracción de m3u8: ```bash python3 test_m3u8_extraction.py "https://www.youtube.com/watch?v=VIDEO_EN_VIVO" ``` ### Probar Transmisión Manual: 1. Obtén la URL m3u8: ```bash yt-dlp -g -f "best[ext=m3u8]/best" "URL_VIDEO" ``` 2. Prueba con FFmpeg (5 segundos): ```bash ffmpeg -re -t 5 -i "URL_M3U8" -c copy -f flv rtmp://destino ``` ### Verificar que FFmpeg puede leer la URL: ```bash ffmpeg -i "URL_M3U8" -t 5 -f null - ``` --- ## 🐛 Solución de Problemas ### Error: "Protocol not found" **Causa:** FFmpeg no puede acceder a la URL HTTPS **Solución:** Verifica que FFmpeg esté compilado con soporte HTTPS: ```bash ffmpeg -protocols | grep https ``` ### Error: "Invalid data found when processing input" **Causa:** La URL m3u8 expiró o no es válida **Solución:** - Las URLs m3u8 de YouTube expiran después de ~6 horas - Extrae una nueva URL con yt-dlp - En el panel, vuelve a seleccionar el video ### Error: "Connection refused" **Causa:** El servidor RTMP rechazó la conexión **Solución:** - Verifica la RTMP URL - Verifica el Stream Key - Asegúrate de que la plataforma permita streaming ### Video se congela o hay buffering **Causa:** Ancho de banda insuficiente o problemas de red **Solución:** - Reduce el número de plataformas simultáneas - Usa recodificación con menor bitrate - Verifica tu conexión a internet --- ## 📊 Comparación: Copy vs Recodificación | Aspecto | `-c copy` | Recodificación | |---------|-----------|----------------| | **Velocidad** | ⚡ Muy rápida | 🐢 Lenta | | **CPU** | 💚 Muy bajo (~5%) | 🔴 Alto (~80%) | | **Calidad** | ✅ Original | ⚠️ Puede perder calidad | | **Latencia** | 💚 Mínima | ⚠️ Varios segundos | | **Compatibilidad** | ⚠️ Depende del origen | ✅ Total control | | **Uso** | Streaming simple | Ajustes de calidad/formato | --- ## 🎯 Recomendaciones ### Para Streaming en Vivo: ✅ **Usar `-c copy`** cuando: - El video es de YouTube (codecs compatibles) - Quieres mínima latencia - Tu CPU es limitada - Transmites a múltiples plataformas ❌ **Usar recodificación** cuando: - Necesitas cambiar resolución - El origen tiene codecs incompatibles - Quieres aplicar filtros - Necesitas bitrate específico ### Para Múltiples Plataformas: - Usa `-c copy` para máximo 3-4 destinos simultáneos - Más de 4 destinos puede saturar tu red - Monitorea el uso de ancho de banda: ~5 Mbps por destino --- ## 📚 Referencias - [FFmpeg Documentation](https://ffmpeg.org/documentation.html) - [yt-dlp Documentation](https://github.com/yt-dlp/yt-dlp) - [HLS Specification](https://datatracker.ietf.org/doc/html/rfc8216) - [RTMP Specification](https://www.adobe.com/devnet/rtmp.html) --- ## ✅ Resumen El sistema ahora: 1. ✅ Extrae URLs m3u8 específicas de YouTube 2. ✅ Usa `-c copy` para streaming eficiente 3. ✅ Muestra la URL m3u8 en el panel web 4. ✅ Incluye ejemplos de comandos FFmpeg 5. ✅ Funciona con la API REST 6. ✅ Incluye script de prueba (`test_m3u8_extraction.py`) **Todo listo para transmitir con máxima eficiencia! 🚀**