Replicar una señal de streaming de un proveedor IPTV y retransmitirla desde un servidor local utilizando Python y FFmpeg.
Para replicar una señal de streaming de un proveedor IPTV y retransmitirla desde un servidor local utilizando Python y FFmpeg, debes seguir estos pasos. Los explico en detalle.
26/07/2024 18:16:16 Update:26/07/2024 18:23:20
### 1. Preparar el entorno
1. **Instalar FFmpeg**: Si no tienes FFmpeg instalado, descárgalo e instálalo desde [FFmpeg official website](https://ffmpeg.org/download.html).
2. **Configurar el servidor web**: Debes tener un servidor web como Apache o Nginx para servir los archivos HLS (HTTP Live Streaming).
- Para **Apache**, añade las siguientes líneas a tu archivo de configuración:
```apache
AddType application/x-mpegURL .m3u8
AddType video/MP2T .ts
```
- Para **Nginx**, en la sección `http` del archivo de configuración:
```nginx
http {
...
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
...
}
```
### 2. Configurar FFmpeg
El siguiente comando de FFmpeg captura una fuente de vídeo (puede ser una URL m3u8 de streaming) y la convierte en un formato adecuado para retransmitir desde tu servidor local en formato HLS.
```python
import subprocess
url = 'URL_DEL_PROVEEDOR_IPTV'
hls_path = '/ruta/donde/guardar/los/segmentos/hls'
command = [
'ffmpeg',
'-loglevel', 'warning',
'-y', '-re', '-stream_loop', '-1', '-i', url,
'-c:v', 'libx264', '-preset', 'ultrafast', '-tune', 'zerolatency', '-pix_fmt', 'yuv420p',
'-c:a', 'aac', '-ar', '44100', '-b:a', '128k', '-g', '60', '-sc_threshold', '0',
'-bsf:v', 'h264_mp4toannexb', '-bsf:a', 'aac_adtstoasc',
'-b:v', '2800k', '-s:v', '854x480', '-maxrate:v', '5600k', '-bufsize:v', '4800k',
'-ignore_unknown', '-strftime', '1',
'-fflags', '+nobuffer', '-flags', 'low_delay', '-max_delay', '0',
'-f', 'hls', '-hls_time', '2', '-hls_list_size', '20', '-hls_flags', 'delete_segments+append_list',
'-master_pl_name', 'master_channel.m3u8',
'-hls_segment_filename', f'{hls_path}/segment_%Y%m%d%H%M%S.ts',
f'{hls_path}/live.m3u8'
]
subprocess.run(command)
```
### 3. Desglose del comando FFmpeg
- `-loglevel warning`: Muestra solo advertencias y errores para reducir el ruido en la salida.
- `-y`: Sobrescribe los archivos de salida sin preguntar.
- `-re`: Procesa la entrada a la velocidad de reproducción real.
- `-stream_loop -1`: Repite el vídeo de entrada infinitamente.
- `-i url`: La URL de entrada del proveedor IPTV.
- `-c:v libx264 -preset ultrafast -tune zerolatency -pix_fmt yuv420p`: Configuración para la codificación de vídeo.
- `-c:a aac -ar 44100 -b:a 128k`: Configuración para la codificación de audio.
- `-g 60 -sc_threshold 0`: Configuración del grupo de imágenes (GOP) y el umbral de escena.
- `-bsf:v h264_mp4toannexb -bsf:a aac_adtstoasc`: Filtros para adaptar los códecs de vídeo y audio.
- `-b:v 2800k -s:v 854x480 -maxrate:v 5600k -bufsize:v 4800k`: Configuración de bitrate y resolución del vídeo.
- `-ignore_unknown -strftime 1`: Ignora flujos desconocidos y usa el formato de fecha y hora en los nombres de los archivos.
- `-fflags +nobuffer -flags low_delay -max_delay 0`: Ajustes para reducir la latencia.
- `-f hls`: Formato de salida HLS.
- `-hls_time 2 -hls_list_size 20 -hls_flags delete_segments+append_list`: Configuración de segmentación HLS.
- `-master_pl_name master_channel.m3u8`: Nombre del archivo de lista maestra.
- `-hls_segment_filename hls_path/segment_%Y%m%d%H%M%S.ts`: Patrón de nombre para los archivos de segmento.
- `hls_path/live.m3u8`: Archivo de lista de reproducción HLS.
### 4. Reproducir en el navegador
Usa una biblioteca como [hls.js](https://github.com/video-dev/hls.js) para reproducir el archivo m3u8 en el navegador.
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Live Stream</title>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
</head>
<body>
<video id="video" controls></video>
<script>
var video = document.getElementById('video');
if (Hls.isSupported()) {
var hls = new Hls();
hls.loadSource('/ruta/al/master_channel.m3u8');
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED, function () {
video.play();
});
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
video.src = '/ruta/al/master_channel.m3u8';
video.addEventListener('canplay', function () {
video.play();
});
}
</script>
</body>
</html>
```
### 5. Ajustes adicionales y pruebas
- **Distintas resoluciones**: Para soportar múltiples resoluciones, deberás ejecutar varios procesos de FFmpeg, cada uno con diferentes configuraciones de resolución y bitrate, y combinarlos en una lista maestra m3u8.
- **Pruebas y optimización**: Realiza pruebas para asegurarte de que la latencia y la calidad de transmisión sean adecuadas.
Estos pasos te permitirán capturar, procesar y retransmitir una señal de streaming de un proveedor IPTV utilizando un servidor local.