#!/bin/bash # Script para convertir videos a HLS (HTTP Live Streaming) # HLS divide el video en segmentos pequeños, permitiendo streaming sin límites de tamaño set -e VIDEOS_DIR="/home/draganel/repos/videoPlayer/videos" cd "$VIDEOS_DIR" echo "🎬 Convirtiendo videos a formato HLS (HTTP Live Streaming)..." echo "📁 Directorio: $VIDEOS_DIR" echo "" # Función para obtener la resolución del video get_resolution() { local file="$1" ffprobe -v error -select_streams v:0 -show_entries stream=height -of csv=p=0 "$file" } # Función para generar HLS con múltiples calidades convert_to_hls() { local input="$1" local base_name="$2" # Crear directorio para este video local output_dir="${base_name}_hls" if [ -d "$output_dir" ]; then echo " ⏭️ HLS ya existe para $base_name, saltando..." return fi mkdir -p "$output_dir" echo " 🔄 Generando HLS para $base_name..." # Obtener resolución original local current_height=$(get_resolution "$input") # Construir comando ffmpeg con múltiples calidades local cmd="ffmpeg -i \"$input\" -hide_banner -loglevel error -stats" # Variable para master playlist local variants="" # 4K (2160p) - 8 Mbps if [ "$current_height" -ge 2160 ]; then cmd="$cmd -vf scale=-2:2160 -c:v libx264 -b:v 8M -maxrate 8.5M -bufsize 16M -c:a aac -b:a 192k -f hls -hls_time 6 -hls_playlist_type vod -hls_segment_filename \"$output_dir/4k_%03d.ts\" \"$output_dir/4k.m3u8\"" variants="$variants\n#EXT-X-STREAM-INF:BANDWIDTH=8000000,RESOLUTION=3840x2160\n4k.m3u8" fi # 2K (1440p) - 5 Mbps if [ "$current_height" -ge 1440 ]; then cmd="$cmd -vf scale=-2:1440 -c:v libx264 -b:v 5M -maxrate 5.5M -bufsize 10M -c:a aac -b:a 192k -f hls -hls_time 6 -hls_playlist_type vod -hls_segment_filename \"$output_dir/2k_%03d.ts\" \"$output_dir/2k.m3u8\"" variants="$variants\n#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=2560x1440\n2k.m3u8" fi # 1080p - 3 Mbps if [ "$current_height" -ge 1080 ]; then cmd="$cmd -vf scale=-2:1080 -c:v libx264 -b:v 3M -maxrate 3.5M -bufsize 6M -c:a aac -b:a 192k -f hls -hls_time 6 -hls_playlist_type vod -hls_segment_filename \"$output_dir/1080p_%03d.ts\" \"$output_dir/1080p.m3u8\"" variants="$variants\n#EXT-X-STREAM-INF:BANDWIDTH=3000000,RESOLUTION=1920x1080\n1080p.m3u8" fi # 720p - 1.5 Mbps if [ "$current_height" -ge 720 ]; then cmd="$cmd -vf scale=-2:720 -c:v libx264 -b:v 1500k -maxrate 1650k -bufsize 3M -c:a aac -b:a 128k -f hls -hls_time 6 -hls_playlist_type vod -hls_segment_filename \"$output_dir/720p_%03d.ts\" \"$output_dir/720p.m3u8\"" variants="$variants\n#EXT-X-STREAM-INF:BANDWIDTH=1500000,RESOLUTION=1280x720\n720p.m3u8" fi # 480p - 800 Kbps (siempre se genera) cmd="$cmd -vf scale=-2:480 -c:v libx264 -b:v 800k -maxrate 900k -bufsize 1600k -c:a aac -b:a 128k -f hls -hls_time 6 -hls_playlist_type vod -hls_segment_filename \"$output_dir/480p_%03d.ts\" \"$output_dir/480p.m3u8\"" variants="$variants\n#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=854x480\n480p.m3u8" # Ejecutar conversión eval $cmd # Crear master playlist echo "#EXTM3U" > "$output_dir/master.m3u8" echo "#EXT-X-VERSION:3" >> "$output_dir/master.m3u8" echo -e "$variants" >> "$output_dir/master.m3u8" echo " ✅ HLS generado para $base_name" echo " 📂 Directorio: $output_dir/" echo " 🎯 Master playlist: $output_dir/master.m3u8" } # Procesar cada archivo de video shopt -s nullglob for video in *.mp4 *.MP4 *.mkv *.MKV; do # Verificar que el archivo existe [ -f "$video" ] || continue # Saltar archivos que ya tienen sufijo de calidad o HLS if [[ "$video" =~ _(4k|2k|1080p|720p|480p|360p)\.(mp4|MP4|mkv|MKV)$ ]] || [[ "$video" =~ _hls ]]; then continue fi echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "📹 Procesando: $video" # Extraer nombre base filename=$(basename -- "$video") extension="${filename##*.}" base_name="${filename%.*}" # Convertir a HLS convert_to_hls "$video" "$base_name" echo "" done echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "✨ ¡Conversión a HLS completada!" echo "" echo "📊 Directorios HLS generados:" ls -d *_hls 2>/dev/null | while read dir; do size=$(du -sh "$dir" | awk '{print $1}') segments=$(find "$dir" -name "*.ts" | wc -l) echo " 📂 $dir - $size ($segments segmentos)" done echo "" echo "💡 Ventajas de HLS:" echo " ✅ Sin límites de tamaño (streaming por segmentos)" echo " ✅ Cambio automático de calidad según conexión" echo " ✅ Compatible con Cloudflare" echo " ✅ Menor uso de ancho de banda"