326 lines
7.6 KiB
Markdown
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! 🚀**
|