# Streaming de video con HLS y DASH: guia completa con FFmpeg
Para servir video en la web de forma eficiente no basta con subir un MP4. Los protocolos de streaming adaptativo (HLS y DASH) ajustan la calidad automaticamente segun la conexion del usuario.
## Que es el streaming adaptativo (ABR)?
ABR divide el video en pequenos segmentos (2-10 segundos) y ofrece varias versiones a diferentes calidades. El reproductor elige en tiempo real la calidad optima segun el ancho de banda.
```
video_original.mp4
|-- 1080p (8 Mbps) -> segmentos_1080p/
|-- 720p (4 Mbps) -> segmentos_720p/
|-- 480p (1.5 Mbps) -> segmentos_480p/
`-- 360p (0.8 Mbps) -> segmentos_360p/
```
## HLS vs DASH
| Caracteristica | HLS | DASH |
|---|---|---|
| Creado por | Apple (2009) | MPEG / W3C (2012) |
| Manifiesto | .m3u8 | .mpd (XML) |
| Segmentos | .ts o .fmp4 | .m4s (fMP4) |
| Compatibilidad nativa | Safari/iOS sin JS | Ninguna (siempre JS) |
| Latencia baja | LL-HLS (< 2s) | CMAF + DASH LL |
| DRM | FairPlay, Widevine | Widevine, PlayReady |
Elegir HLS para iOS/Safari sin JS. DASH para ecosistemas web/Android puros. En la practica muchos sirven ambos.
## Generar HLS con FFmpeg
### HLS basico (una resolucion)
```bash
ffmpeg -i video_original.mp4 \
-c:v libx264 -c:a aac \
-hls_time 6 \
-hls_playlist_type vod \
-hls_segment_filename "segmentos/seg_%03d.ts" \
playlist.m3u8
```
### HLS con multiples resoluciones (ABR completo)
```bash
ffmpeg -i video_original.mp4 \
-filter_complex "
[0:v]split=4[v1][v2][v3][v4];
[v1]scale=1920:1080[v1080];
[v2]scale=1280:720[v720];
[v3]scale=854:480[v480];
[v4]scale=640:360[v360]
" \
-map "[v1080]" -map 0:a -c:v:0 libx264 -b:v:0 5000k -c:a:0 aac -b:a:0 192k \
-hls_time 6 -hls_segment_filename "1080p/seg_%03d.ts" 1080p/playlist.m3u8 \
-map "[v720]" -map 0:a -c:v:1 libx264 -b:v:1 2800k -c:a:1 aac -b:a:1 128k \
-hls_time 6 -hls_segment_filename "720p/seg_%03d.ts" 720p/playlist.m3u8 \
-map "[v480]" -map 0:a -c:v:2 libx264 -b:v:2 1400k -c:a:2 aac -b:a:2 128k \
-hls_time 6 -hls_segment_filename "480p/seg_%03d.ts" 480p/playlist.m3u8 \
-map "[v360]" -map 0:a -c:v:3 libx264 -b:v:3 800k -c:a:3 aac -b:a:3 96k \
-hls_time 6 -hls_segment_filename "360p/seg_%03d.ts" 360p/playlist.m3u8
```
### Manifiesto maestro (master.m3u8)
```
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=5200000,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2"
1080p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2900000,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.2"
720p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1500000,RESOLUTION=854x480,CODECS="avc1.4d401f,mp4a.40.2"
480p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=900000,RESOLUTION=640x360,CODECS="avc1.42001e,mp4a.40.2"
360p/playlist.m3u8
```
## Generar DASH con FFmpeg
```bash
ffmpeg -i video_original.mp4 \
-filter_complex "
[0:v]split=3[v1][v2][v3];
[v1]scale=1280:720[v720];
[v2]scale=854:480[v480];
[v3]scale=640:360[v360]
" \
-map "[v720]" -c:v:0 libx264 -b:v:0 2800k \
-map "[v480]" -c:v:1 libx264 -b:v:1 1400k \
-map "[v360]" -c:v:2 libx264 -b:v:2 800k \
-map 0:a -c:a aac -b:a 128k \
-use_template 1 -use_timeline 1 \
-seg_duration 6 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-f dash manifest.mpd
```
## Reproducir HLS en el navegador
### Video.js
```html
```
### HLS.js (para navegadores sin soporte nativo)
```html
```
## Parametros de calidad recomendados
| Resolucion | Bitrate video | Bitrate audio | Uso |
|---|---|---|---|
| 4K (3840x2160) | 15-20 Mbps | 192 kbps | Premium |
| 1080p (1920x1080) | 4-8 Mbps | 192 kbps | HD estandar |
| 720p (1280x720) | 2-4 Mbps | 128 kbps | Streaming HD |
| 480p (854x480) | 1-1.5 Mbps | 128 kbps | Conexiones medias |
| 360p (640x360) | 0.5-1 Mbps | 96 kbps | Movil / lento |
## Despliegue en CDN (Nginx)
```nginx
server {
location /streaming/ {
root /var/www/media;
add_header Access-Control-Allow-Origin "*";
add_header Cache-Control "public, max-age=86400";
types {
application/x-mpegURL m3u8;
video/mp2t ts;
application/dash+xml mpd;
video/mp4 mp4 m4s;
}
}
}
```
## Conversion online
Para convertir video a formatos web sin configurar FFmpeg, KaijuConverter transforma MP4, MKV, MOV y otros formatos directamente en el navegador.
Guía