3.2 KiB
3.2 KiB
Black Frame Detection Feature
Overview
This feature automatically detects when video encoding produces an output where >95% of all frames are black (indicating total encoding failure) and skips that encode from the queue instead of creating a corrupted file.
How It Works
During Encoding
- Real-time FFmpeg progress monitoring occurs
- (No frame-by-frame analysis during encoding)
After Encoding (Quality Check)
- The
BlackFrameAnalyzeranalyzes the first 5 minutes of the encoded output - Uses FFmpeg's
blackdetectfilter to identify all black frame segments - Calculates: What percentage of the 5-minute duration is black frames?
- Flagging threshold: >95% black = encoding failure, output is deleted
- Pass threshold: ≤95% black = acceptable (includes legitimate black scenes, credits, transitions)
Queue Behavior
When >95% black frames detected:
- In normal/smart mode: The file is skipped, and processing continues to the next file in queue
- In forced mode (--cq or --bitrate): After max consecutive failures, processing stops
- The corrupted output file is automatically deleted
- A detailed warning is logged to the failure log
Examples
✅ File PASSES (Not Deleted)
- Video with 5-second fade-to-black: ~3% black → PASSES
- Video with black opening credits (20 seconds): ~6% black → PASSES
- Video with multiple scene transitions to black: ~8% black → PASSES
❌ File FAILS (Deleted as Corrupted)
- Video where entire encode is black: 100% black → FAILS
- Video where 98% of frames are black: 98% black → FAILS
- Video with only brief snippets of content: 96% black → FAILS
Implementation Details
Files Modified
core/black_frame_detector.py
BlackFrameAnalyzer.analyze_output_for_black():- Analyzes first 5 minutes of output
- Accumulates total black frame duration
- Calculates percentage:
(total_black_duration / 300_seconds) * 100 - Flags if >95% black
core/encode_engine.py
- Calls
BlackFrameAnalyzerafter encoding completes - Logs percentage of black frames
- Deletes output if >95% black and raises exception
core/process_manager.py
- Catches
BlackFrameDetectionException - Skips to next file in queue or stops if max consecutive failures
Configuration
Current parameters:
- Sample duration: First 5 minutes (300 seconds) of output analyzed
- Pixel threshold: 95% of pixels must be black to count as a black frame
- Time threshold: Minimum 0.01 seconds to count as black segment
- Corruption threshold: >95% of total duration must be black to flag
Logging
Check logs/conversion.log and logs/failure.log:
# File PASSES - has some black scenes but mostly content
[INFO] Black frame analysis: 8.5% of first 300s is black
# File FAILS - entire encode is black
[WARNING] Output file is 98.3% black frames - ENCODING FAILURE
Why This Approach?
This method detects actual encoding failures (entire video is black) while ignoring:
- ✅ Fade-to-black transitions
- ✅ Black credit sequences
- ✅ Dark scenes
- ✅ Black letterboxing or pillarboxing
- ❌ Only catches: Entire video is black (encoding error)