5.6 KiB
5.6 KiB
AV1 Batch Video Transcoder
A clean, modular batch video transcoding system using NVIDIA's AV1 NVENC codec with intelligent audio and subtitle handling.
Project Structure
conversion_project/
├── main.py - CLI entry point for batch transcoding
├── config.xml - Configuration (encoding settings, audio buckets, etc.)
│
├── core/ - Core modules
│ ├── config_helper.py - XML configuration loader
│ ├── logger_helper.py - Logging setup
│ ├── process_manager.py - Main transcoding orchestration
│ ├── encode_engine.py - FFmpeg command builder and execution
│ ├── audio_handler.py - Audio stream analysis and bitrate decisions
│ ├── video_handler.py - Video resolution detection and scaling logic
│ └── hardware_helper.py - Hardware detection (GPU/CPU)
│
├── /rename/ - Separate rename utility (rolling_rename.py)
├── /path_manager/ - GUI path management (kept separate from conversion)
│ ├── gui_path_manager.py
│ ├── transcode.bat
│ ├── paths.txt
│ └── cache/
│
├── logs/ - Log files and conversion tracker CSV
├── processing/ - Temporary encoding files (cleaned up after move)
└── cache/ (removed) - Folder cache now in /path_manager/cache
Quick Start
Basic Usage
# Encode a folder (smart mode: CQ first, bitrate fallback if size exceeds 75%)
python main.py "P:\tv\Show Name"
# Force CQ mode with specific quality
python main.py "P:\movies\Movie" --cq 30
# Force Bitrate mode
python main.py "P:\tv\Show" --m bitrate
# Explicit resolution
python main.py "P:\movies\Movie" --r 1080
# Test mode: encode first file only, show compression ratio, don't move files
python main.py "P:\tv\Show" --test
# Optional: tag audio streams with language code
python main.py "P:\tv\Show" --language eng
Features
- Hardware Encoding: NVIDIA av1_nvenc (10-bit p010le, preset p1)
- Smart Audio: Analyzes streams, re-encodes excessive bitrate, preserves good quality
- Smart Video: Detects source resolution, scales 4K→1080p, preserves lower resolutions
- Subtitle Detection: Auto-finds and embeds subtitles (vtt, srt, ass, ssa, sub)
- Supports language-prefixed files:
movie.en.vtt,movie.eng.vtt - Cleans up subtitle files after embedding
- Supports language-prefixed files:
- Two-Phase Encoding (smart mode):
- Phase 1: Try CQ mode for quality
- Phase 2: Retry failed files with Bitrate mode
- File Tagging: Encodes output with
- [EHX]suffix - CSV Tracking: Detailed conversion log with compression ratios
- Automatic Cleanup: Deletes originals + subtitles after successful move
Configuration
Edit config.xml to customize:
- CQ Values: Per content type (tv_1080, tv_720, movie_1080, movie_720)
- Audio Buckets: Bitrate targets for stereo/multichannel
- Fallback Bitrates: Used in Phase 2 bitrate retry
- Subtitle Settings: Extensions to detect, codec for embedding
- Path Mappings: Windows ↔ Linux path conversion (optional)
Encoding Process (Per File)
- Detect subtitles: Looks for matching
.en.vtt,.srt, etc. - Analyze source: Resolution, audio streams, bitrates
- FFmpeg encode:
- Video: AV1 NVENC (10-bit p010le)
- Audio: Per-stream decisions (copy or re-encode)
- Subtitles: Embedded as SRT (if found)
- Size check: Compare output vs original (default 75% threshold)
- Move file: From temp folder → original location with
- [EHX]suffix - Cleanup: Delete original file + subtitle file
Audio Encoding Logic
Stereo audio?
├─ YES + 1080p: [>192kbps] ENCODE to 192k AAC, [≤192k] COPY
├─ YES + 720p: [>160kbps] ENCODE to 160k AAC, [≤160k] COPY
└─ NO (Multichannel): ENCODE to 384k/448k AAC (5.1)
Removed Features
- ❌ Sonarr/Radarr integration (was complex, removed for simplicity)
- ❌ Auto-rename based on Sonarr metadata
- ❌ Web UI (kept separate if needed in future)
- ❌ Rename functionality (moved to
/renamefolder)
Advanced Options
Test Mode
Encodes first file only, shows compression ratio, leaves file in temp folder:
python main.py "P:\tv\Show" --test
Useful for: Testing CQ values, checking quality before batch conversion.
Language Tagging (Optional)
Only tags audio if explicitly provided:
python main.py "P:\tv\Show" --language eng
Without --language flag, original audio metadata is preserved.
Resolution Override
Force specific output resolution:
python main.py "P:\movies" --r 720 # Force 720p
python main.py "P:\tv" --r 1080 # Force 1080p
Output Examples
Input File:
SupernaturalS07E21.mkv (size: 1.5GB)
SupernaturalS07E21.en.vtt (subtitle)
Output:
SupernaturalS07E21 - [EHX].mkv (size: 450MB, subtitle embedded)
(original files deleted)
Troubleshooting
Wrong Bitrate
Check CQ values in config.xml or use --cq override:
python main.py "P:\tv\Show" --cq 31
Subtitles Not Embedding
- Verify file is named correctly:
filename.en.vttorfilename.vtt - Check
config.xmlhas subtitles enabled and extensions listed - Check logs for "Found subtitle" message
Files Not Moving
Check if reduction ratio threshold (default 0.75) is exceeded:
python main.py "P:\tv\Show" --test # Check ratio in Phase 1
If ratio is high, lower CQ value or use bitrate mode.
Logs
logs/conversion.log: Detailed encoding info, errors, decisionslogs/conversion_tracker.csv: Summary table of all conversionslogs/conversion_failures.log: Failed file tracking