Carlos s commited on
Commit
4970af2
·
verified ·
1 Parent(s): afcfc4e

Update api/ltx_server.py

Browse files
Files changed (1) hide show
  1. api/ltx_server.py +52 -24
api/ltx_server.py CHANGED
@@ -437,39 +437,67 @@ class VideoService:
437
 
438
 
439
 
440
- def _concat_crossfade_cascade(self, videos, output_path, crossfade_frames=8):
 
441
  """
442
- Concatena vídeos em cascata com crossfade.
443
 
444
- :param videos: lista de caminhos de vídeos
445
- :param output_path: caminho final do vídeo concatenado
446
- :param crossfade_frames: duração do crossfade em frames
 
447
  """
448
- if len(videos) < 2:
449
- raise ValueError("Precisa de pelo menos 2 vídeos para concatenar")
450
-
451
- temp_video = videos[0]
452
 
453
- for i in range(1, len(videos)):
454
- next_video = videos[i]
455
- tmp_output = f"/tmp/cascade_{i}.mp4"
456
-
457
- cmd = f"""
458
- ffmpeg -y -i "{temp_video}" -i "{next_video}" -filter_complex "
 
 
 
 
 
 
 
 
 
 
459
  [0:v]trim=0:-{crossfade_frames},setpts=PTS-STARTPTS[v0pre];
460
  [0:v]trim=-{crossfade_frames},setpts=PTS-STARTPTS[v0fade];
461
  [1:v]trim=0:{crossfade_frames},setpts=PTS-STARTPTS[v1fade];
462
  [v0fade][v1fade]blend=all_expr='A*(1-T/{crossfade_frames})+B*(T/{crossfade_frames})'[xf];
463
- [0:v]trim=0:-{crossfade_frames},setpts=PTS-STARTPTS[v0start];
464
- [1:v]trim={crossfade_frames}:,setpts=PTS-STARTPTS[v1end];
465
- [v0start][xf][v1end]concat=n=3:v=1:a=0[v]" -map "[v]" -c:v libx264 -pix_fmt yuv420p "{tmp_output}"
466
  """
467
-
468
- subprocess.run(cmd, shell=True, check=True)
469
- temp_video = tmp_output # próximo loop concatena sobre este
470
-
471
- # Renomeia o último temporário como saída final
472
- os.rename(temp_video, output_path)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
473
 
474
 
475
  def generate(
 
437
 
438
 
439
 
440
+
441
+ def _concat_crossfade_cascade(self, video_paths: List[str], output_path: str, crossfade_frames: int = 8):
442
  """
443
+ Concatena vídeos em cascata com crossfade, usando FFmpeg.
444
 
445
+ Args:
446
+ video_paths (List[str]): Lista de caminhos dos vídeos a serem concatenados.
447
+ output_path (str): Caminho do arquivo final de saída.
448
+ crossfade_frames (int): Número de frames para o crossfade.
449
  """
450
+ if len(video_paths) < 2:
451
+ raise ValueError("É necessário pelo menos 2 vídeos para concatenação com crossfade.")
 
 
452
 
453
+ # Cria uma lista de temporários
454
+ tmp_videos = []
455
+ for i in range(len(video_paths) - 1):
456
+ # Nome do arquivo temporário
457
+ tmp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4").name
458
+ tmp_videos.append(tmp_file)
459
+
460
+ # Define vídeos para crossfade
461
+ if i == 0:
462
+ vid1 = video_paths[0]
463
+ else:
464
+ vid1 = tmp_videos[i-1]
465
+ vid2 = video_paths[i+1]
466
+
467
+ # Filter complex FFmpeg
468
+ filter_complex = f"""
469
  [0:v]trim=0:-{crossfade_frames},setpts=PTS-STARTPTS[v0pre];
470
  [0:v]trim=-{crossfade_frames},setpts=PTS-STARTPTS[v0fade];
471
  [1:v]trim=0:{crossfade_frames},setpts=PTS-STARTPTS[v1fade];
472
  [v0fade][v1fade]blend=all_expr='A*(1-T/{crossfade_frames})+B*(T/{crossfade_frames})'[xf];
473
+ [1:v]trim={crossfade_frames}:,setpts=PTS-STARTPTS[v1post];
474
+ [v0pre][xf][v1post]concat=n=3:v=1:a=0[v]
 
475
  """
476
+
477
+ cmd = [
478
+ "ffmpeg", "-y",
479
+ "-i", vid1,
480
+ "-i", vid2,
481
+ "-filter_complex", filter_complex,
482
+ "-map", "[v]",
483
+ "-c:v", "libx264",
484
+ "-pix_fmt", "yuv420p",
485
+ tmp_file
486
+ ]
487
+
488
+ print(f"[DEBUG] Executando: {' '.join(cmd)}")
489
+ subprocess.run(cmd, check=True)
490
+
491
+ # Último temporário é o arquivo final
492
+ final_tmp = tmp_videos[-1]
493
+ os.rename(final_tmp, output_path)
494
+
495
+ # Limpa os temporários intermediários
496
+ for tmp in tmp_videos[:-1]:
497
+ if os.path.exists(tmp):
498
+ os.remove(tmp)
499
+
500
+ print(f"[INFO] Vídeo final gerado: {output_path}")
501
 
502
 
503
  def generate(