#!/bin/bash # Video chop script - extracts a portion of a video file using ffmpeg # Usage: video-chop.sh set -e # Check if all required parameters are provided if [ $# -ne 3 ]; then echo "Usage: $0 " echo "Example: $0 /path/to/video.mp4 10 30" echo " This will extract from second 10 to second 30" exit 1 fi VIDEO_FILE="$1" START_SECONDS="$2" END_SECONDS="$3" # Validate that the video file exists if [ ! -f "$VIDEO_FILE" ]; then echo "Error: Video file '$VIDEO_FILE' not found" exit 1 fi # Validate that start and end are numbers if ! [[ "$START_SECONDS" =~ ^[0-9]+\.?[0-9]*$ ]]; then echo "Error: Start seconds must be a valid number" exit 1 fi if ! [[ "$END_SECONDS" =~ ^[0-9]+\.?[0-9]*$ ]]; then echo "Error: End seconds must be a valid number" exit 1 fi # Validate that end is greater than start if (( $(echo "$END_SECONDS <= $START_SECONDS" | bc -l) )); then echo "Error: End seconds must be greater than start seconds" exit 1 fi # Get the directory and filename DIRNAME=$(dirname "$VIDEO_FILE") BASENAME=$(basename "$VIDEO_FILE") # Get the file extension EXTENSION="${BASENAME##*.}" FILENAME="${BASENAME%.*}" # Generate timestamp prefix (YYYYMMDD_HHMMSS) TIMESTAMP=$(date +"%Y%m%d_%H%M%S") # Create output filename with timestamp prefix OUTPUT_FILE="${DIRNAME}/${TIMESTAMP}_${FILENAME}.${EXTENSION}" # Calculate duration DURATION=$(echo "$END_SECONDS - $START_SECONDS" | bc) echo "Input file: $VIDEO_FILE" echo "Start: ${START_SECONDS}s" echo "End: ${END_SECONDS}s" echo "Duration: ${DURATION}s" echo "Output file: $OUTPUT_FILE" echo "" # Run ffmpeg to extract the portion # Using -ss before -i for fast seeking, and -t for duration ffmpeg -y -ss "$START_SECONDS" -i "$VIDEO_FILE" -t "$DURATION" -c copy "$OUTPUT_FILE" echo "" echo "Done! Output saved to: $OUTPUT_FILE"