Fix rendering.......

This commit is contained in:
2025-09-08 20:46:55 +02:00
parent 1a086f9362
commit 83b40af001

View File

@@ -1632,6 +1632,10 @@ class VideoEditor:
else:
output_width = int(crop_width * self.zoom_factor)
output_height = int(crop_height * self.zoom_factor)
# Ensure dimensions are divisible by 2 for H.264 encoding
output_width = output_width - (output_width % 2)
output_height = output_height - (output_height % 2)
# Send progress update
self.render_progress_queue.put(("progress", "Setting up FFmpeg encoder...", 0.1, 0.0))
@@ -1845,44 +1849,43 @@ class VideoEditor:
def _render_with_ffmpeg_pipe(self, output_path: str, start_frame: int, end_frame: int, output_width: int, output_height: int):
"""Render video with transformations"""
try:
# Test FFmpeg with a simple command first
try:
subprocess.run(['ffmpeg', '-version'], capture_output=True, check=True)
except (subprocess.CalledProcessError, FileNotFoundError):
error_msg = "FFmpeg not found - please install FFmpeg and ensure it's in your PATH"
test_result = subprocess.run(['ffmpeg', '-version'], capture_output=True, text=True, timeout=10)
if test_result.returncode != 0:
print(f"FFmpeg test failed with return code {test_result.returncode}")
print(f"FFmpeg stderr: {test_result.stderr}")
error_msg = "FFmpeg is not working properly"
self.render_progress_queue.put(("error", error_msg, 1.0, 0.0))
return False
except (subprocess.CalledProcessError, FileNotFoundError, subprocess.TimeoutExpired) as e:
error_msg = f"FFmpeg not found or not working: {e}"
print(error_msg)
self.render_progress_queue.put(("error", error_msg, 1.0, 0.0))
return False
self.render_progress_queue.put(("progress", "Starting encoder...", 0.0, 0.0))
ffmpeg_cmd = [
'ffmpeg', '-y', '-v', 'quiet',
'-f', 'rawvideo',
'-vcodec', 'rawvideo',
'-s', f'{output_width}x{output_height}',
'-pix_fmt', 'bgr24',
'-r', str(self.fps),
'-i', '-', # Read from stdin
'-c:v', 'libx264',
'-preset', 'fast',
'-crf', '18',
'-pix_fmt', 'yuv420p',
output_path
]
import tempfile
import os
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.raw')
temp_file.close()
ffmpeg_cmd[ffmpeg_cmd.index('-i') + 1] = temp_file.name
self.ffmpeg_process = subprocess.Popen(
ffmpeg_cmd,
stderr=subprocess.PIPE,
stdout=subprocess.DEVNULL,
creationflags=subprocess.CREATE_NO_WINDOW if hasattr(subprocess, 'CREATE_NO_WINDOW') else 0
)
# Use a simpler, more Windows-compatible FFmpeg command
ffmpeg_cmd = [
'ffmpeg', '-y',
'-f', 'rawvideo',
'-s', f'{output_width}x{output_height}',
'-pix_fmt', 'bgr24',
'-r', str(self.fps),
'-i', temp_file.name,
'-c:v', 'libx264',
'-preset', 'fast',
'-crf', '18',
'-pix_fmt', 'yuv420p',
output_path
]
self.temp_file_name = temp_file.name
render_cap = cv2.VideoCapture(str(self.video_path))
@@ -1927,11 +1930,27 @@ class VideoEditor:
self.render_progress_queue.put(("progress", "Encoding...", 0.9, 0.0))
stderr = self.ffmpeg_process.communicate()[1]
return_code = self.ffmpeg_process.returncode
self.ffmpeg_process = None
# Use subprocess.run() with timeout for better Windows reliability
result = subprocess.run(
ffmpeg_cmd,
capture_output=True,
text=True,
timeout=300, # 5 minute timeout
creationflags=subprocess.CREATE_NO_WINDOW if hasattr(subprocess, 'CREATE_NO_WINDOW') else 0
)
if hasattr(self, 'temp_file_name') and os.path.exists(self.temp_file_name):
return_code = result.returncode
stdout = result.stdout
stderr = result.stderr
# Debug output
print(f"FFmpeg return code: {return_code}")
if stdout:
print(f"FFmpeg stdout: {stdout}")
if stderr:
print(f"FFmpeg stderr: {stderr}")
if os.path.exists(self.temp_file_name):
try:
os.unlink(self.temp_file_name)
except OSError:
@@ -1944,7 +1963,7 @@ class VideoEditor:
print(f"Successfully rendered {frames_written} frames (avg {avg_fps:.1f} FPS)")
return True
else:
error_details = stderr.decode() if stderr else "No error details available"
error_details = stderr if stderr else "No error details available"
print(f"Encoding failed with return code {return_code}")
print(f"Error: {error_details}")
self.render_progress_queue.put(("error", f"Encoding failed: {error_details}", 1.0, 0.0))