EuuIia commited on
Commit
f5ae12e
·
verified ·
1 Parent(s): a37a873

Update api/ltx_server.py

Browse files
Files changed (1) hide show
  1. api/ltx_server.py +20 -30
api/ltx_server.py CHANGED
@@ -437,58 +437,48 @@ class VideoService:
437
 
438
 
439
 
440
-
441
-
442
- def _concat_crossfade_videos_por_frames(self, mp4_list, out_path, fps=24, crossfade_frames=8):
443
  """
444
- Concatena múltiplos vídeos MP4 aplicando crossfade visual (blend) controlado por número de frames.
445
- Não inclui áudio.
446
-
447
- Args:
448
- mp4_list (List[str]): Lista de vídeos a concatenar.
449
- out_path (str): Caminho do vídeo final.
450
- fps (int): Frames por segundo dos vídeos.
451
- crossfade_frames (int): Número de frames para a transição entre vídeos consecutivos.
452
  """
453
  if len(mp4_list) < 2:
454
- raise ValueError("Forneça ao menos dois vídeos para concatenar com crossfade.")
455
 
456
- inputs = " ".join([f"-i '{v}'" for v in mp4_list])
457
  filter_parts = []
458
- concat_refs = []
459
 
460
- # Ajustar vídeos individuais
461
- for i in range(len(mp4_list)):
462
  filter_parts.append(f"[{i}:v]setpts=PTS-STARTPTS[v{i}]")
463
 
464
- # Criar blends (crossfade) entre pares consecutivos
465
  for i in range(len(mp4_list) - 1):
466
- # Determine o início do fade do primeiro vídeo
467
- # Primeiro vídeo: todos os frames menos os últimos crossfade_frames
468
  filter_parts.append(
469
  f"[v{i}]trim=0:-{crossfade_frames},setpts=PTS-STARTPTS[v{i}pre];"
470
  f"[v{i}]trim=-{crossfade_frames},setpts=PTS-STARTPTS[v{i}fade];"
471
  f"[v{i+1}]trim=0:{crossfade_frames},setpts=PTS-STARTPTS[v{i+1}fade];"
472
  f"[v{i}fade][v{i+1}fade]blend=all_expr='A*(1-T/{crossfade_frames})+B*(T/{crossfade_frames})'[xf{i}]"
473
  )
474
- concat_refs.append(f"[v{i}pre][xf{i}]")
475
 
476
- # Último vídeo sem fade
477
- concat_refs.append(f"[v{len(mp4_list)-1}]")
478
 
479
- # Concat final
480
- filter_complex = ";".join(filter_parts) + ";" + "".join(concat_refs) + f"concat=n={len(concat_refs)}:v=1:a=0[v]"
 
481
 
482
- # Montar comando
 
483
  cmd = f"ffmpeg -y {inputs} -filter_complex \"{filter_complex}\" -map \"[v]\" -c:v libx264 -pix_fmt yuv420p '{out_path}'"
484
-
485
- print(f"[DEBUG] Executando FFmpeg:\n{cmd}\n")
486
 
487
- # Executar comando via shell
488
  subprocess.run(cmd, shell=True, check=True)
 
489
 
490
- print(f"✅ Vídeo final gerado: {out_path}")
491
-
492
  def generate(
493
  self,
494
  prompt,
 
437
 
438
 
439
 
440
+ def concat_crossfade_videos_por_frames(mp4_list, out_path, crossfade_frames=8):
 
 
441
  """
442
+ Concatena múltiplos vídeos com crossfade visual em número de frames.
443
+ Funciona mesmo com mais de 2 vídeos.
 
 
 
 
 
 
444
  """
445
  if len(mp4_list) < 2:
446
+ raise ValueError("É necessário ao menos dois vídeos.")
447
 
 
448
  filter_parts = []
449
+ concat_sequence = []
450
 
451
+ # Ajuste inicial de PTS
452
+ for i, path in enumerate(mp4_list):
453
  filter_parts.append(f"[{i}:v]setpts=PTS-STARTPTS[v{i}]")
454
 
455
+ # Cria crossfades entre pares consecutivos
456
  for i in range(len(mp4_list) - 1):
 
 
457
  filter_parts.append(
458
  f"[v{i}]trim=0:-{crossfade_frames},setpts=PTS-STARTPTS[v{i}pre];"
459
  f"[v{i}]trim=-{crossfade_frames},setpts=PTS-STARTPTS[v{i}fade];"
460
  f"[v{i+1}]trim=0:{crossfade_frames},setpts=PTS-STARTPTS[v{i+1}fade];"
461
  f"[v{i}fade][v{i+1}fade]blend=all_expr='A*(1-T/{crossfade_frames})+B*(T/{crossfade_frames})'[xf{i}]"
462
  )
463
+ concat_sequence.append(f"[v{i}pre][xf{i}]")
464
 
465
+ # Último vídeo completo
466
+ concat_sequence.append(f"[v{len(mp4_list)-1}]")
467
 
468
+ # Monta concat final
469
+ concat_str = "".join(concat_sequence)
470
+ filter_complex = ";".join(filter_parts) + ";" + concat_str + f"concat=n={len(concat_sequence)}:v=1:a=0[v]"
471
 
472
+ # Comando FFmpeg
473
+ inputs = " ".join([f"-i '{v}'" for v in mp4_list])
474
  cmd = f"ffmpeg -y {inputs} -filter_complex \"{filter_complex}\" -map \"[v]\" -c:v libx264 -pix_fmt yuv420p '{out_path}'"
 
 
475
 
476
+ print("[DEBUG] Executando FFmpeg:\n", cmd)
477
  subprocess.run(cmd, shell=True, check=True)
478
+ print("✅ Vídeo final gerado:", out_path)
479
 
480
+
481
+
482
  def generate(
483
  self,
484
  prompt,