TubeScript-API/M3U8_STREAMING.md
2026-01-29 22:49:00 -07:00

7.6 KiB

🔗 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:

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:

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:
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:

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

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

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:

"-f", "best[ext=m3u8]"

Para calidad específica:

"-f", "bestvideo[height<=1080][ext=m3u8]+bestaudio[ext=m3u8]/best"

Para menor calidad (menos ancho de banda):

"-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:

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:

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:

python3 test_m3u8_extraction.py "https://www.youtube.com/watch?v=VIDEO_EN_VIVO"

Probar Transmisión Manual:

  1. Obtén la URL m3u8:
yt-dlp -g -f "best[ext=m3u8]/best" "URL_VIDEO"
  1. Prueba con FFmpeg (5 segundos):
ffmpeg -re -t 5 -i "URL_M3U8" -c copy -f flv rtmp://destino

Verificar que FFmpeg puede leer la URL:

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:

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


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! 🚀