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

326 lines
7.6 KiB
Markdown

# 🔗 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! 🚀**