feat: Archipelago demo stack (lightweight)
This commit is contained in:
126
neode-ui/optimize-video.sh
Executable file
126
neode-ui/optimize-video.sh
Executable file
@@ -0,0 +1,126 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Video Optimization Script for Web
|
||||
# Optimizes video-intro.mp4 for web use while preserving quality
|
||||
|
||||
set -e
|
||||
|
||||
VIDEO_DIR="public/assets/video"
|
||||
INPUT_FILE="${VIDEO_DIR}/video-intro.mp4"
|
||||
OUTPUT_FILE="${VIDEO_DIR}/video-intro-optimized.mp4"
|
||||
BACKUP_FILE="${VIDEO_DIR}/video-intro-backup-$(date +%Y%m%d-%H%M%S).mp4"
|
||||
|
||||
echo "🎬 Video Optimization Script"
|
||||
echo "============================"
|
||||
echo ""
|
||||
|
||||
# Check if FFmpeg is installed
|
||||
if ! command -v ffmpeg &> /dev/null; then
|
||||
echo "❌ FFmpeg is not installed."
|
||||
echo ""
|
||||
echo "Install it with:"
|
||||
echo " macOS: brew install ffmpeg"
|
||||
echo " Linux: sudo apt install ffmpeg"
|
||||
echo " Windows: Download from https://ffmpeg.org/download.html"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if input file exists
|
||||
if [ ! -f "$INPUT_FILE" ]; then
|
||||
echo "❌ Input file not found: $INPUT_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "📹 Input file: $INPUT_FILE"
|
||||
INPUT_SIZE=$(du -h "$INPUT_FILE" | cut -f1)
|
||||
echo " Size: $INPUT_SIZE"
|
||||
echo ""
|
||||
|
||||
# Get video info
|
||||
echo "📊 Analyzing video..."
|
||||
DURATION=$(ffprobe -v quiet -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$INPUT_FILE" 2>/dev/null || echo "unknown")
|
||||
RESOLUTION=$(ffprobe -v quiet -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$INPUT_FILE" 2>/dev/null || echo "unknown")
|
||||
echo " Duration: ${DURATION}s"
|
||||
echo " Resolution: ${RESOLUTION}"
|
||||
echo ""
|
||||
|
||||
# Create backup
|
||||
echo "💾 Creating backup..."
|
||||
cp "$INPUT_FILE" "$BACKUP_FILE"
|
||||
echo " Backup saved to: $BACKUP_FILE"
|
||||
echo ""
|
||||
|
||||
# Optimize video for web (target ~1MB)
|
||||
echo "⚙️ Optimizing video for web (target ~1MB)..."
|
||||
echo " Using H.264 with optimized settings"
|
||||
echo " Preset: slow (best compression efficiency)"
|
||||
echo " Resolution: 1280x720 (HD, good quality)"
|
||||
echo " Frame rate: 30fps (smooth playback)"
|
||||
echo ""
|
||||
|
||||
ffmpeg -i "$INPUT_FILE" \
|
||||
-c:v libx264 \
|
||||
-preset slow \
|
||||
-crf 28 \
|
||||
-profile:v high \
|
||||
-level 4.0 \
|
||||
-pix_fmt yuv420p \
|
||||
-vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" \
|
||||
-r 30 \
|
||||
-c:a aac \
|
||||
-b:a 64k \
|
||||
-ar 44100 \
|
||||
-movflags +faststart \
|
||||
-threads 0 \
|
||||
-y \
|
||||
"$OUTPUT_FILE" 2>&1 | grep -E "(Duration|Stream|frame|size|time)" || true
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo ""
|
||||
echo "✅ Optimization complete!"
|
||||
echo ""
|
||||
|
||||
OUTPUT_SIZE=$(du -h "$OUTPUT_FILE" | cut -f1)
|
||||
OUTPUT_BYTES=$(stat -f%z "$OUTPUT_FILE" 2>/dev/null || stat -c%s "$OUTPUT_FILE" 2>/dev/null)
|
||||
OUTPUT_MB=$(echo "scale=2; $OUTPUT_BYTES / 1024 / 1024" | bc 2>/dev/null || echo "unknown")
|
||||
|
||||
echo "📊 Results:"
|
||||
echo " Original size: $INPUT_SIZE"
|
||||
echo " Optimized size: $OUTPUT_SIZE (~${OUTPUT_MB}MB)"
|
||||
|
||||
# Calculate compression ratio
|
||||
ORIGINAL_BYTES=$(stat -f%z "$INPUT_FILE" 2>/dev/null || stat -c%s "$INPUT_FILE" 2>/dev/null)
|
||||
if [ -n "$ORIGINAL_BYTES" ] && [ -n "$OUTPUT_BYTES" ]; then
|
||||
RATIO=$(echo "scale=1; ($ORIGINAL_BYTES - $OUTPUT_BYTES) * 100 / $ORIGINAL_BYTES" | bc)
|
||||
echo " Size reduction: ${RATIO}%"
|
||||
|
||||
# Check if target achieved
|
||||
TARGET_BYTES=1048576 # 1MB in bytes
|
||||
if [ "$OUTPUT_BYTES" -gt "$TARGET_BYTES" ]; then
|
||||
EXCESS=$(echo "scale=1; ($OUTPUT_BYTES - $TARGET_BYTES) / 1024 / 1024" | bc)
|
||||
echo ""
|
||||
echo "⚠️ File size is ${EXCESS}MB over 1MB target"
|
||||
echo " Consider using CRF 30-32 for smaller file size"
|
||||
else
|
||||
echo ""
|
||||
echo "✅ Target achieved! File is under 1MB"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "🔄 Replacing original file..."
|
||||
mv "$OUTPUT_FILE" "$INPUT_FILE"
|
||||
echo " ✅ Original file replaced with optimized version"
|
||||
echo ""
|
||||
echo "💡 To restore backup:"
|
||||
echo " mv \"$BACKUP_FILE\" \"$INPUT_FILE\""
|
||||
else
|
||||
echo ""
|
||||
echo "❌ Optimization failed. Original file preserved."
|
||||
rm -f "$OUTPUT_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✨ Done! Video optimized for web (~1MB target)."
|
||||
|
||||
Reference in New Issue
Block a user