Initializing
Back to Projects
Year2024
DomainFullstack
AccessOpen Source
Complexity0 / 10
PythonCLIVideo ProcessingFFmpeg
FullstackArchived

Bulk Video Processor

A professional bulk video processing tool with resolution conversion, codec selection, quality profiles, video filters, and real-time progress tracking.

# Bulk Video Processor

An interactive command-line tool for bulk video processing, resolution conversion, and optimization. Built with a professional terminal UI that guides users through each step of the processing pipeline.

Features Overview

Parsing system architecture diagram...

Core Features

Bulk Video Processing

Process entire directories of videos with optional subdirectory support:

python
def process_directory(source_dir: str, output_dir: str, settings: dict):
    video_extensions = ['.mp4', '.avi', '.mov', '.mkv', '.wmv', '.flv', '.webm', '.m4v']
    
    for root, dirs, files in os.walk(source_dir):
        for file in files:
            if any(file.lower().endswith(ext) for ext in video_extensions):
                process_video(os.path.join(root, file), output_dir, settings)

Resolution Presets

PresetResolutionUse Case
4K3840×2160Ultra HD displays
2K2560×1440QHD monitors
1080p1920×1080Full HD streaming
720p1280×720Mobile/HD
480p854×480SD, low bandwidth
360p640×360Mobile, minimal bandwidth
1K1024×576Custom (as requested)

Codec Support

python
CODEC_OPTIONS = {
    "H.264 (MP4)": {
        "extension": ".mp4",
        "video_codec": "libx264",
        "audio_codec": "aac"
    },
    "H.265 (MP4)": {
        "extension": ".mp4", 
        "video_codec": "libx265",
        "audio_codec": "aac"
    },
    "VP9 (WebM)": {
        "extension": ".webm",
        "video_codec": "libvpx-vp9",
        "audio_codec": "libopus"
    }
}

Quality Profiles

ProfileCRFFFmpeg PresetDescription
High Quality18slowBest quality, larger files
Balanced23mediumGood quality/size balance
High Compression28fastSmaller files, acceptable quality
Ultra Compression32veryfastSmallest files, lower quality

CRF (Constant Rate Factor): Lower = better quality. Range 0-51.

Video Filters

python
def apply_filters(video_path: str, filter_settings: dict) -> str:
    filters = []
    
    if filter_settings.get('denoise'):
        filters.append('nlmeans=s=10')
    
    if filter_settings.get('sharpen'):
        filters.append('unsharp=5:5:1.0:5:5:0.0')
    
    if filter_settings.get('brightness'):
        filters.append(f'eq=brightness={filter_settings["brightness"]}')
    
    if filter_settings.get('contrast'):
        filters.append(f'eq=contrast={filter_settings["contrast"]}')
    
    return ','.join(filters)

Two-Pass Encoding

Optional two-pass encoding for maximum quality:

python
# First pass: Analyze video
ffmpeg -i input.mp4 -pass 1 -f null -y

# Second pass: Encode with analysis data
ffmpeg -i input.mp4 -pass 2 output.mp4

Interactive CLI

The tool uses Rich for professional terminal UI:

python
from rich.console import Console
from rich.progress import Progress, SpinnerColumn, BarColumn

console = Console()

console.print(Panel.fit(
    "[bold cyan]Aatmanova Bulk Video Processor[/bold cyan]\n"
    "by Bhargab Pratim Sarma",
    border_style="cyan"
))

User Workflow

code
--- Step 1: Select Source Folder ---
Enter the path to your source video folder: /Users/videos/raw

--- Step 2: Configure Output ---
Save output to default location? (/Users/videos/raw-Processed) [Y/n]: 

--- Step 3: Choose Target Resolution ---
┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓
ResolutionDimensionsUse Case
┡━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 4K         │ 3840x2160Ultra HD, high-end
│ 1080p      │ 1920x1080Full HD, standard
│ 720p       │ 1280x720HD, mobile devices
└────────────┴───────────────┴──────────────────────────┘
Select target resolution: 1080p

--- Step 6: Additional Options ---
Maintain aspect ratio when scaling? [Y/n]: Y
Use two-pass encoding? [y/N]: n
Maintain original subfolder structure? [Y/n]: Y

Progress Tracking

python
with Progress(
    SpinnerColumn(),
    TextColumn("[progress.description]{task.description}"),
    BarColumn(),
    TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
    console=console
) as progress:
    task = progress.add_task("Processing videos...", total=len(videos))
    
    for video in videos:
        process_video(video)
        progress.update(task, advance=1)

FFmpeg Integration

python
import ffmpeg

def convert_video(input_path: str, output_path: str, settings: dict):
    stream = ffmpeg.input(input_path)
    
    # Resolution scaling
    if settings['resolution']:
        stream = stream.filter('scale', 
            settings['resolution']['width'],
            settings['resolution']['height'],
            force_original_aspect_ratio='decrease'
        )
    
    # Video codec and quality
    stream = ffmpeg.output(
        stream, 
        output_path,
        vcodec=settings['codec'],
        crf=settings['crf'],
        preset=settings['preset'],
        acodec=settings.get('audio_codec', 'aac')
    )
    
    ffmpeg.run(stream, overwrite_output=True)

Processing Log

Automatically generates processing_log.json:

json
{
  "timestamp": "2025-09-19T17:30:00",
  "settings": {
    "source": "/path/to/videos",
    "output": "/path/to/output",
    "resolution": "1080p",
    "codec": "H.264",
    "quality": "Balanced"
  },
  "results": [
    {
      "input": "video1.mp4",
      "output": "video1_processed.mp4",
      "original_size": "150MB",
      "output_size": "45MB",
      "compression": "70%",
      "duration": "2m 30s"
    }
  ]
}

Hardware Acceleration

Optional GPU acceleration for NVIDIA:

python
# Replace CPU codecs with GPU equivalents
GPU_CODECS = {
    "libx264": "h264_nvenc",
    "libx265": "hevc_nvenc"
}

if use_gpu and has_nvidia_gpu():
    video_codec = GPU_CODEC_MAPPING.get(video_codec, video_codec)

Prerequisites

FFmpeg Installation

Windows:

  1. Download from gyan.dev/ffmpeg/builds
  2. Extract to C:\ffmpeg
  3. Add C:\ffmpeg\bin to PATH

macOS:

bash
brew install ffmpeg

Linux:

bash
sudo apt install ffmpeg

Verify installation:

bash
ffmpeg -version

Python Setup

bash
python -m venv venv
source venv/bin/activate  # or venv\Scripts\activate on Windows
pip install -r requirements.txt

PyInstaller Packaging

Create standalone executable:

bash
pip install pyinstaller
pyinstaller --onefile --name "BulkVideoProcessor" bulk_video_processor.py

Output: dist/BulkVideoProcessor.exe

Note: Users still need FFmpeg installed on their system.

File Organization

code
Input/
├── videos/
│   ├── movie1.mp4
│   ├── movie2.avi
│   └── subfolder/
│       └── movie3.mov

Output/
├── videos-Processed/
│   ├── movie1_processed.mp4
│   ├── movie2_processed.mp4
│   ├── subfolder/
│   │   └── movie3_processed.mp4
│   └── processing_log.json

Performance Tips

  1. Use SSD: Faster I/O for source and output
  2. More RAM: Better caching (8GB+ recommended)
  3. Multi-core CPU: FFmpeg uses multiple cores
  4. Faster presets: Use fast or veryfast for bulk
  5. Don't upscale: Only downscale, upscaling doesn't improve quality

Use Cases

  1. Content creators: Batch convert recordings to upload-friendly formats
  2. Archival: Compress legacy video collections
  3. Mobile: Downscale 4K footage to 720p for phone viewing
  4. Web: Convert to WebM for web embedding
  5. Backup: Convert to space-saving H.265

Architecture Feedback

Spotted a potential optimization or antipattern? Let me know.

Submit a Technical Suggestion