merge: modules/video_models/video_save.py

pull/4678/head
vladmandic 2026-03-12 14:16:51 +01:00
parent 5451bbeec4
commit 24e3416e02
1 changed files with 24 additions and 4 deletions

View File

@ -193,6 +193,24 @@ def atomic_save_video(filename: str,
shared.state.end(savejob)
def save_thumbnail(video_path, tensor=None):
try:
base = os.path.splitext(video_path)[0]
thumb_path = f'{base}.thumb.jpg'
if tensor is not None and len(tensor) > 0:
frame = Image.fromarray(tensor[0].numpy())
else:
from modules.video import get_video_params
_frames, _fps, _dur, _w, _h, _codec, frame = get_video_params(video_path, capture=True)
if frame is not None:
frame.thumbnail((512, 512), Image.Resampling.LANCZOS)
frame.save(thumb_path, quality=80)
return thumb_path
except Exception as e:
log.debug(f'Video thumbnail: {e}')
return None
def save_video(
p:processing.StableDiffusionProcessingVideo,
pixels:torch.Tensor=None,
@ -229,17 +247,18 @@ def save_video(
except Exception as e:
log.error(f'Video output: file="{output_video}" write error {e}')
errors.display(e, 'video')
return 0, output_video
thumb = save_thumbnail(output_video)
return 0, output_video, thumb
if pixels is None:
return 0, output_video
return 0, output_video, None
if isinstance(pixels, np.ndarray):
pixels = numpy_to_tensor(pixels)
if isinstance(pixels, list) and isinstance(pixels[0], Image.Image):
pixels = images_to_tensor(pixels)
if not torch.is_tensor(pixels):
log.error(f'Video: type={type(pixels)} not a tensor')
return 0, output_video
return 0, output_video, None
t_save = time.time()
n, _c, t, h, w = pixels.shape
size = pixels.element_size() * pixels.numel()
@ -297,4 +316,5 @@ def save_video(
log.error(f'Video save: raw={size} {e}')
errors.display(e, 'video')
timer.process.add('save', time.time()-t_save)
return t, output_video
thumb = save_thumbnail(output_video) if output_video is not None else None
return t, output_video, thumb