```bash #!/bin/bash # Script para editar videos de streaming al estilo Instagram/TikTok # Uso: ./edit_video.sh input.mp4 [inicio] [duracion] # Colores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Verificar que ffmpeg esté instalado if ! command -v ffmpeg &> /dev/null; then echo -e "${RED}Error: ffmpeg no está instalado${NC}" echo "Instala con: sudo pacman -S ffmpeg" exit 1 fi # Función de ayuda show_help() { echo "Uso: $0 [inicio] [duracion] [opciones]" echo "" echo "Argumentos posicionales:" echo " input.mp4 Video de entrada" echo " inicio Tiempo de inicio (formato: 00:05:30 o 330)" echo " duracion Duración del clip (formato: 00:00:30 o 30)" echo "" echo "Opciones:" echo " -o, --output Nombre del archivo de salida" echo " -r, --ratio Aspect ratio: 9:16 (vertical), 1:1 (cuadrado), 16:9 (horizontal)" echo " -s, --speed Velocidad: 0.5 (lento), 1.0 (normal), 2.0 (rápido)" echo " -z, --zoom Factor de zoom: 1.0-2.0" echo " -b, --blur Añadir blur en los bordes (letterbox)" echo " -t, --text Añadir texto/subtítulo" echo " -f, --fade Añadir fade in/out" echo " -q, --quality Preset de calidad: ultrafast, fast, medium, slow" echo " -c, --compress Comprimir para redes sociales" echo " --vertical Formato vertical (9:16) - shortcut" echo " --square Formato cuadrado (1:1) - shortcut" echo " -h, --help Mostrar esta ayuda" echo "" echo "Ejemplos:" echo " $0 stream.mp4 00:05:30 30 --vertical" echo " $0 stream.mp4 330 30 -r 9:16 -s 1.5 -z 1.2 -f" echo " $0 stream.mp4 0 60 --square -t \"Mi clip\" -b" } # Valores por defecto INPUT="" START_TIME="0" DURATION="" OUTPUT="" ASPECT_RATIO="9:16" SPEED="1.0" ZOOM="1.0" ADD_BLUR=false TEXT="" ADD_FADE=false QUALITY="medium" COMPRESS=false # Parsear argumentos POSITIONAL_ARGS=() while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -o|--output) OUTPUT="$2" shift 2 ;; -r|--ratio) ASPECT_RATIO="$2" shift 2 ;; -s|--speed) SPEED="$2" shift 2 ;; -z|--zoom) ZOOM="$2" shift 2 ;; -b|--blur) ADD_BLUR=true shift ;; -t|--text) TEXT="$2" shift 2 ;; -f|--fade) ADD_FADE=true shift ;; -q|--quality) QUALITY="$2" shift 2 ;; -c|--compress) COMPRESS=true shift ;; --vertical) ASPECT_RATIO="9:16" shift ;; --square) ASPECT_RATIO="1:1" shift ;; *) POSITIONAL_ARGS+=("$1") shift ;; esac done # Restaurar argumentos posicionales set -- "${POSITIONAL_ARGS[@]}" # Validar argumentos requeridos if [ $# -lt 1 ]; then echo -e "${RED}Error: Se requiere al menos el archivo de entrada${NC}" show_help exit 1 fi INPUT="$1" [ $# -ge 2 ] && START_TIME="$2" [ $# -ge 3 ] && DURATION="$3" # Validar que el archivo existe if [ ! -f "$INPUT" ]; then echo -e "${RED}Error: El archivo '$INPUT' no existe${NC}" exit 1 fi # Generar nombre de salida si no se especificó if [ -z "$OUTPUT" ]; then BASENAME=$(basename "$INPUT" | sed 's/\.[^.]*$//') OUTPUT="${BASENAME}_edited_$(date +%Y%m%d_%H%M%S).mp4" fi echo -e "${GREEN}=== Editor de Video FFmpeg ===${NC}" echo "Input: $INPUT" echo "Inicio: $START_TIME" echo "Duración: ${DURATION:-"hasta el final"}" echo "Output: $OUTPUT" echo "Aspect Ratio: $ASPECT_RATIO" echo "Velocidad: ${SPEED}x" echo "Zoom: ${ZOOM}x" echo "" # Calcular dimensiones según aspect ratio case $ASPECT_RATIO in 9:16|vertical) WIDTH=1080 HEIGHT=1920 ;; 1:1|square) WIDTH=1080 HEIGHT=1080 ;; 16:9|horizontal) WIDTH=1920 HEIGHT=1080 ;; *) echo -e "${YELLOW}Advertencia: Aspect ratio no reconocido, usando 9:16${NC}" WIDTH=1080 HEIGHT=1920 ;; esac # Construir filtros de video FILTERS="" # 1. Ajustar velocidad si es necesario if [ "$SPEED" != "1.0" ]; then FILTERS="${FILTERS}setpts=PTS/${SPEED}," fi # 2. Aplicar zoom si es necesario if [ "$ZOOM" != "1.0" ]; then FILTERS="${FILTERS}scale=iw*${ZOOM}:ih*${ZOOM},crop=iw/${ZOOM}:ih/${ZOOM}," fi # 3. Blur en los bordes (efecto letterbox popular en Instagram) if [ "$ADD_BLUR" = true ]; then FILTERS="${FILTERS}split[main][blur];[blur]scale=${WIDTH}:${HEIGHT}:force_original_aspect_ratio=increase,crop=${WIDTH}:${HEIGHT},boxblur=20:5[blurred];[blurred][main]overlay=(W-w)/2:(H-h)/2," else # Solo escalar y hacer crop FILTERS="${FILTERS}scale=${WIDTH}:${HEIGHT}:force_original_aspect_ratio=increase,crop=${WIDTH}:${HEIGHT}," fi # 4. Añadir fade in/out if [ "$ADD_FADE" = true ]; then FADE_DURATION=1 if [ -n "$DURATION" ]; then # Calcular duración en segundos si está en formato HH:MM:SS if [[ $DURATION =~ : ]]; then DUR_SEC=$(echo "$DURATION" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }') else DUR_SEC=$DURATION fi FILTERS="${FILTERS}fade=t=in:st=0:d=${FADE_DURATION},fade=t=out:st=$((DUR_SEC - FADE_DURATION)):d=${FADE_DURATION}," else FILTERS="${FILTERS}fade=t=in:st=0:d=${FADE_DURATION}," fi fi # 5. Añadir texto si se especificó if [ -n "$TEXT" ]; then # Escapar caracteres especiales TEXT_ESCAPED=$(echo "$TEXT" | sed "s/:/\\\\:/g" | sed "s/'/\\\\'/g") FILTERS="${FILTERS}drawtext=fontfile=/usr/share/fonts/TTF/DejaVuSans-Bold.ttf:text='${TEXT_ESCAPED}':fontcolor=white:fontsize=48:box=1:boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=h-th-50," fi # Remover la última coma FILTERS="${FILTERS%,}" # Construir comando ffmpeg FFMPEG_CMD="ffmpeg -i \"$INPUT\"" # Añadir tiempo de inicio if [ "$START_TIME" != "0" ]; then FFMPEG_CMD="$FFMPEG_CMD -ss $START_TIME" fi # Añadir duración if [ -n "$DURATION" ]; then FFMPEG_CMD="$FFMPEG_CMD -t $DURATION" fi # Añadir filtros de video if [ -n "$FILTERS" ]; then FFMPEG_CMD="$FFMPEG_CMD -vf \"$FILTERS\"" fi # Ajustar audio a la velocidad if [ "$SPEED" != "1.0" ]; then FFMPEG_CMD="$FFMPEG_CMD -af \"atempo=$SPEED\"" fi # Configuración de encoding if [ "$COMPRESS" = true ]; then # Optimizado para redes sociales FFMPEG_CMD="$FFMPEG_CMD -c:v libx264 -preset $QUALITY -crf 23 -c:a aac -b:a 128k -movflags +faststart" else # Calidad alta FFMPEG_CMD="$FFMPEG_CMD -c:v libx264 -preset $QUALITY -crf 18 -c:a aac -b:a 192k -movflags +faststart" fi # Forzar framerate FFMPEG_CMD="$FFMPEG_CMD -r 30" # Output FFMPEG_CMD="$FFMPEG_CMD \"$OUTPUT\"" # Mostrar comando echo -e "${YELLOW}Ejecutando:${NC}" echo "$FFMPEG_CMD" | sed 's/ -/\n -/g' echo "" # Ejecutar eval $FFMPEG_CMD # Verificar resultado if [ $? -eq 0 ]; then FILE_SIZE=$(du -h "$OUTPUT" | cut -f1) echo "" echo -e "${GREEN}✓ Video editado exitosamente!${NC}" echo "Archivo: $OUTPUT" echo "Tamaño: $FILE_SIZE" echo "" echo "Para ver el resultado:" echo " mpv \"$OUTPUT\"" else echo -e "${RED}✗ Error al procesar el video${NC}" exit 1 fi ```