147 lines
3.9 KiB
Bash
Executable File
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! 🎬"
|