Files
memefast/bash/webm_fps_analyse.sh
2025-06-13 09:44:18 +08:00

147 lines
3.9 KiB
Bash
Executable File

#!/bin/bash
# WebM FPS Analyzer Script
# Analyzes FPS of all WebM files in specified directory (or current directory)
# Usage function
usage() {
echo "Usage: $0 [directory_path]"
echo " directory_path: Path to directory containing WebM files (optional, defaults to current directory)"
echo ""
echo "Examples:"
echo " $0 # Analyze current directory"
echo " $0 /path/to/webm/files # Analyze specific directory"
echo " $0 ~/Videos # Analyze home Videos directory"
}
# Check if ffprobe is available
if ! command -v ffprobe &> /dev/null; then
echo "Error: ffprobe is not installed or not in PATH"
echo "Please install ffmpeg to use this script"
exit 1
fi
# Handle command line arguments
if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
usage
exit 0
fi
# Set target directory
if [[ -n "$1" ]]; then
target_dir="$1"
# Expand tilde if present
target_dir="${target_dir/#\~/$HOME}"
# Check if directory exists
if [[ ! -d "$target_dir" ]]; then
echo "Error: Directory '$target_dir' does not exist"
exit 1
fi
# Check if directory is readable
if [[ ! -r "$target_dir" ]]; then
echo "Error: Directory '$target_dir' is not readable"
exit 1
fi
else
target_dir="."
fi
# Initialize variables
declare -a fps_values=()
declare -a filenames=()
total_fps=0
count=0
min_fps=""
max_fps=""
echo "Analyzing WebM files in directory: $target_dir"
echo "========================================"
# Find all .webm files and process them
for file in "$target_dir"/*.webm; do
# Check if any .webm files exist
if [[ ! -e "$file" ]]; then
echo "No WebM files found in directory: $target_dir"
exit 0
fi
# Get just the filename for display
filename=$(basename "$file")
echo "Processing: $filename"
# Extract FPS using ffprobe
fps=$(ffprobe -v quiet -select_streams v:0 -show_entries stream=r_frame_rate -of csv=p=0 "$file" 2>/dev/null)
# Check if fps extraction was successful
if [[ -z "$fps" ]]; then
echo " ⚠️ Could not determine FPS for $filename"
continue
fi
# Convert fraction to decimal if needed (e.g., "30/1" to "30")
if [[ "$fps" == *"/"* ]]; then
# Use bc for floating point division if available, otherwise use awk
if command -v bc &> /dev/null; then
fps_decimal=$(echo "scale=3; $fps" | bc)
else
fps_decimal=$(awk "BEGIN {printf \"%.3f\", $fps}")
fi
else
fps_decimal="$fps"
fi
echo " 📊 FPS: $fps_decimal"
# Store values
fps_values+=("$fps_decimal")
filenames+=("$filename")
# Update statistics
if [[ -z "$min_fps" ]] || (( $(echo "$fps_decimal < $min_fps" | awk '{print ($1 < $2)}') )); then
min_fps="$fps_decimal"
fi
if [[ -z "$max_fps" ]] || (( $(echo "$fps_decimal > $max_fps" | awk '{print ($1 > $2)}') )); then
max_fps="$fps_decimal"
fi
total_fps=$(awk "BEGIN {printf \"%.3f\", $total_fps + $fps_decimal}")
((count++))
echo ""
done
# Check if any files were processed
if [[ $count -eq 0 ]]; then
echo "No valid WebM files could be processed."
exit 0
fi
# Calculate average
average_fps=$(awk "BEGIN {printf \"%.3f\", $total_fps / $count}")
# Display results
echo "========================================"
echo "ANALYSIS RESULTS"
echo "========================================"
echo "Files processed: $count"
echo ""
echo "📈 STATISTICS:"
echo " Minimum FPS: $min_fps"
echo " Maximum FPS: $max_fps"
echo " Average FPS: $average_fps"
echo ""
echo "📋 INDIVIDUAL FILE DETAILS:"
echo "----------------------------------------"
# Display individual file FPS
for i in "${!filenames[@]}"; do
printf "%-40s | %s FPS\n" "${filenames[$i]}" "${fps_values[$i]}"
done
echo "----------------------------------------"
echo "Analysis complete! 🎬"