Carlos s
commited on
Update api/ltx_server.py
Browse files- api/ltx_server.py +2 -50
api/ltx_server.py
CHANGED
|
@@ -503,56 +503,8 @@ class VideoService:
|
|
| 503 |
print(f"⚠️ Falha ao ler metadados de {path}")
|
| 504 |
return {}
|
| 505 |
|
| 506 |
-
def _gerar_lista_com_transicoes(self, pasta: str, video_paths: list[str], crossfade_frames: int = 8) -> list[str]:
|
| 507 |
-
"""
|
| 508 |
-
Gera uma nova lista de vídeos aplicando transições suaves (crossfade de N frames)
|
| 509 |
-
entre cada par de vídeos da lista original.
|
| 510 |
-
Sanitiza logs e valida cada saída antes de adicioná-la à lista final.
|
| 511 |
-
"""
|
| 512 |
-
if len(video_paths) < 2:
|
| 513 |
-
print("⚠️ Lista de vídeos muito curta, nada a mesclar.")
|
| 514 |
-
return video_paths
|
| 515 |
-
|
| 516 |
-
nova_lista = []
|
| 517 |
-
for i in range(len(video_paths) - 1):
|
| 518 |
-
v1 = video_paths[i]
|
| 519 |
-
v2 = video_paths[i + 1]
|
| 520 |
-
out = os.path.join(pasta, f"transicao_{i+1}.mp4")
|
| 521 |
-
|
| 522 |
-
# Comando FFmpeg com crossfade simples (exemplo usando blend)
|
| 523 |
-
cmd = (
|
| 524 |
-
f"ffmpeg -hide_banner -loglevel error -y "
|
| 525 |
-
f"-i {shlex.quote(v1)} -i {shlex.quote(v2)} "
|
| 526 |
-
f"-filter_complex "
|
| 527 |
-
f"\"[0:v][1:v]blend=all_expr='A*(1-T/{crossfade_frames})+B*(T/{crossfade_frames})',"
|
| 528 |
-
f"format=yuv420p\" "
|
| 529 |
-
f"-an {shlex.quote(out)}"
|
| 530 |
-
)
|
| 531 |
-
|
| 532 |
-
print(f"[DEBUG] Gerando transição {i+1}: {cmd}")
|
| 533 |
-
try:
|
| 534 |
-
subprocess.run(shlex.split(cmd), check=True)
|
| 535 |
-
except subprocess.CalledProcessError as e:
|
| 536 |
-
print(f"❌ Erro na transição {i+1}: {e}")
|
| 537 |
-
continue
|
| 538 |
|
| 539 |
-
|
| 540 |
-
if not os.path.exists(out) or os.path.getsize(out) == 0:
|
| 541 |
-
print(f"⚠️ Transição {i+1} falhou (arquivo vazio ou ausente).")
|
| 542 |
-
continue
|
| 543 |
-
|
| 544 |
-
# Mostra o DNA do vídeo gerado antes de adicioná-lo
|
| 545 |
-
dna = self._get_video_info(out)
|
| 546 |
-
if not dna or dna["duração"] == 0:
|
| 547 |
-
print(f"⚠️ Arquivo corrompido: {out}")
|
| 548 |
-
continue
|
| 549 |
-
|
| 550 |
-
nova_lista.append(out)
|
| 551 |
-
|
| 552 |
-
print(f"✅ Nova lista de vídeos pronta: {nova_lista}")
|
| 553 |
-
return nova_lista
|
| 554 |
-
|
| 555 |
-
def _gerar_lista_com_transicoes1(self, pasta: str, video_paths: list[str], crossfade_frames: int = 8) -> list[str]:
|
| 556 |
"""
|
| 557 |
Gera uma nova lista de vídeos aplicando transições suaves (crossfade de N frames)
|
| 558 |
entre cada par de vídeos da lista original.
|
|
@@ -645,7 +597,7 @@ class VideoService:
|
|
| 645 |
print(f"[DEBUG] Nova lista final de {len(nova_lista)} arquivos criada.")
|
| 646 |
return nova_lista
|
| 647 |
|
| 648 |
-
def
|
| 649 |
"""
|
| 650 |
Concatena múltiplos MP4s sem reencode usando o demuxer do ffmpeg.
|
| 651 |
ATENÇÃO: todos os arquivos precisam ter mesmo codec, fps, resolução etc.
|
|
|
|
| 503 |
print(f"⚠️ Falha ao ler metadados de {path}")
|
| 504 |
return {}
|
| 505 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 506 |
|
| 507 |
+
def _gerar_lista_com_transicoes(self, pasta: str, video_paths: list[str], crossfade_frames: int = 8) -> list[str]:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 508 |
"""
|
| 509 |
Gera uma nova lista de vídeos aplicando transições suaves (crossfade de N frames)
|
| 510 |
entre cada par de vídeos da lista original.
|
|
|
|
| 597 |
print(f"[DEBUG] Nova lista final de {len(nova_lista)} arquivos criada.")
|
| 598 |
return nova_lista
|
| 599 |
|
| 600 |
+
def _concat_mp4s_no_reencode(self, mp4_list: List[str], out_path: str):
|
| 601 |
"""
|
| 602 |
Concatena múltiplos MP4s sem reencode usando o demuxer do ffmpeg.
|
| 603 |
ATENÇÃO: todos os arquivos precisam ter mesmo codec, fps, resolução etc.
|