Update
This commit is contained in:
165
bash/test_prores_to_hevc.sh
Executable file
165
bash/test_prores_to_hevc.sh
Executable file
@@ -0,0 +1,165 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Fixed script to convert ProRes 4444 alpha to HEVC alpha
|
||||
# Usage: ./test_prores_to_hevc.sh input.mov
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 input_prores4444.mov"
|
||||
echo "Example: ./test_prores_to_hevc.sh animation.mov"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
prores_file="$1"
|
||||
|
||||
# Check if input file exists
|
||||
if [ ! -f "$prores_file" ]; then
|
||||
echo "Error: File '$prores_file' not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Generate output filename
|
||||
base_name=$(basename "$prores_file" .mov)
|
||||
hevc_output="${base_name}_hevc.mov"
|
||||
|
||||
echo "=== Testing ProRes 4444 to HEVC Alpha Conversion ==="
|
||||
echo "Input ProRes: $prores_file"
|
||||
echo "Output HEVC: $hevc_output"
|
||||
echo ""
|
||||
|
||||
# Check input file properties
|
||||
echo "=== Input File Analysis ==="
|
||||
echo "ProRes file properties:"
|
||||
ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name,pix_fmt,width,height,bit_rate -of csv=p=0 "$prores_file"
|
||||
echo ""
|
||||
|
||||
# Check if input has alpha channel (HEVC embeds alpha natively)
|
||||
has_alpha=$(ffprobe -v quiet -select_streams v:0 -show_entries stream=pix_fmt -of csv=p=0 "$prores_file" | grep -E "(yuva|rgba|argb|bgra|abgr)")
|
||||
if [ -z "$has_alpha" ]; then
|
||||
echo "Note: Input shows standard pixel format (HEVC will embed alpha natively if present)"
|
||||
fi
|
||||
|
||||
# Show input file size
|
||||
input_size=$(stat -f%z "$prores_file" 2>/dev/null || stat -c%s "$prores_file" 2>/dev/null)
|
||||
echo "Input file size: $(awk "BEGIN {printf \"%.1f\", $input_size/1024/1024}")MB"
|
||||
echo ""
|
||||
|
||||
# Test if VideoToolbox supports HEVC on this system
|
||||
echo "=== Testing VideoToolbox HEVC Support ==="
|
||||
vt_test=$(ffmpeg -f lavfi -i "color=red:size=100x100:duration=1" -c:v hevc_videotoolbox -f null - 2>&1)
|
||||
if echo "$vt_test" | grep -q "not supported\|failed\|error"; then
|
||||
echo "VideoToolbox doesn't support HEVC on this system, falling back to software encoder"
|
||||
use_software=true
|
||||
else
|
||||
echo "VideoToolbox HEVC support detected"
|
||||
use_software=false
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Convert ProRes 4444 to HEVC Alpha with improved settings
|
||||
echo "=== Converting ProRes 4444 to HEVC Alpha ==="
|
||||
|
||||
if [ "$use_software" = true ]; then
|
||||
# Software encoder fallback matching Apple's settings
|
||||
echo "Using software HEVC encoder (libx265)..."
|
||||
cmd="ffmpeg -y -i \"$prores_file\" -map 0:a -map 0:v -c:a aac -b:a 129k -c:v libx265 -b:v 4885k -preset medium -colorspace bt709 -color_primaries bt709 -color_trc bt709 -movflags +faststart \"$hevc_output\""
|
||||
echo "Command: $cmd"
|
||||
echo ""
|
||||
|
||||
ffmpeg -y -i "$prores_file" \
|
||||
-map 0:a -map 0:v \
|
||||
-c:a aac -b:a 129k \
|
||||
-c:v libx265 \
|
||||
-b:v 4885k \
|
||||
-preset medium \
|
||||
-colorspace bt709 \
|
||||
-color_primaries bt709 \
|
||||
-color_trc bt709 \
|
||||
-movflags +faststart \
|
||||
"$hevc_output"
|
||||
else
|
||||
# VideoToolbox matching Apple's exact Encode Media output
|
||||
echo "Using VideoToolbox HEVC encoder (matching Apple's exact Encode Media)..."
|
||||
cmd="ffmpeg -y -i \"$prores_file\" -map 0:a -map 0:v -c:a aac -b:a 129k -c:v hevc_videotoolbox -b:v 4885k -colorspace bt709 -color_primaries bt709 -color_trc bt709 -vtag hvc1 -movflags +faststart \"$hevc_output\""
|
||||
echo "Command: $cmd"
|
||||
echo ""
|
||||
|
||||
ffmpeg -y -i "$prores_file" \
|
||||
-c:v hevc_videotoolbox \
|
||||
-pix_fmt bgra \
|
||||
-alpha_quality 1 \
|
||||
-tag:v hvc1 \
|
||||
"$hevc_output"
|
||||
fi
|
||||
|
||||
if [ $? -eq 0 ] && [ -f "$hevc_output" ]; then
|
||||
echo ""
|
||||
echo "✓ SUCCESS: HEVC conversion complete!"
|
||||
ls -lh "$hevc_output"
|
||||
|
||||
# Verify the output file isn't corrupted
|
||||
echo ""
|
||||
echo "=== Verifying Output File Integrity ==="
|
||||
verify_result=$(ffprobe -v error -select_streams v:0 -count_frames -show_entries stream=nb_frames -of csv=p=0 "$hevc_output" 2>&1)
|
||||
if echo "$verify_result" | grep -q "error\|corrupt\|invalid"; then
|
||||
echo "✗ WARNING: Output file may be corrupted"
|
||||
echo "Verification result: $verify_result"
|
||||
else
|
||||
echo "✓ Output file integrity verified"
|
||||
echo "Frame count: $verify_result"
|
||||
fi
|
||||
|
||||
# Show file size comparison
|
||||
output_size=$(stat -f%z "$hevc_output" 2>/dev/null || stat -c%s "$hevc_output" 2>/dev/null)
|
||||
if [ ! -z "$input_size" ] && [ ! -z "$output_size" ]; then
|
||||
ratio=$(awk "BEGIN {printf \"%.1f\", $output_size/$input_size}")
|
||||
compression=$(awk "BEGIN {printf \"%.1f\", $input_size/$output_size}")
|
||||
echo ""
|
||||
echo "=== File Size Comparison ==="
|
||||
echo "ProRes 4444: $(awk "BEGIN {printf \"%.1f\", $input_size/1024/1024}")MB"
|
||||
echo "HEVC Alpha: $(awk "BEGIN {printf \"%.1f\", $output_size/1024/1024}")MB"
|
||||
echo "Size ratio: ${ratio}x (${compression}x compression)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== Output File Analysis ==="
|
||||
echo "HEVC file properties:"
|
||||
ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name,pix_fmt,width,height,bit_rate -of csv=p=0 "$hevc_output"
|
||||
|
||||
# HEVC embeds alpha natively - visual verification required
|
||||
echo "✓ HEVC file created (alpha embedded natively - verify visually)"
|
||||
|
||||
echo ""
|
||||
echo "✓ TEST COMPLETE: $hevc_output created successfully!"
|
||||
echo "✓ Open the file in Safari or QuickTime to verify alpha transparency works!"
|
||||
|
||||
else
|
||||
echo ""
|
||||
echo "✗ FAILED: HEVC conversion failed"
|
||||
|
||||
# Try alternative approach if VideoToolbox failed
|
||||
if [ "$use_software" = false ]; then
|
||||
echo ""
|
||||
echo "Trying software encoder as fallback..."
|
||||
|
||||
ffmpeg -y -i "$prores_file" \
|
||||
-map 0:a -map 0:v \
|
||||
-c:a aac -b:a 129k \
|
||||
-c:v libx265 \
|
||||
-b:v 4885k \
|
||||
-preset medium \
|
||||
-colorspace bt709 \
|
||||
-color_primaries bt709 \
|
||||
-color_trc bt709 \
|
||||
-movflags +faststart \
|
||||
"${base_name}_hevc_sw.mov"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✓ SUCCESS with software encoder: ${base_name}_hevc_sw.mov"
|
||||
else
|
||||
echo "✗ Both hardware and software encoders failed"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
Reference in New Issue
Block a user