🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
128 lines
4.8 KiB
Bash
Executable File
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"
|