Files
videoPlayer/convert-to-hls.sh
2025-10-02 01:52:03 -06:00

128 lines
4.8 KiB
Bash
Executable File

#!/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"