Update app.py
Browse files
app.py
CHANGED
|
@@ -160,7 +160,7 @@ if st.button("Gerar Vídeo(s)"):
|
|
| 160 |
|
| 161 |
filtros_corte = []
|
| 162 |
|
| 163 |
-
# ✅ Zoom Progressivo
|
| 164 |
if ativar_zoom_dinamico:
|
| 165 |
filtros_corte.append(
|
| 166 |
f"zoompan=z='min(zoom+{zoom_dinamico_velocidade},1.5)':d=1:"
|
|
@@ -169,13 +169,13 @@ if st.button("Gerar Vídeo(s)"):
|
|
| 169 |
else:
|
| 170 |
filtros_corte.append("scale=trunc(iw/2)*2:trunc(ih/2)*2")
|
| 171 |
|
| 172 |
-
# ✅
|
| 173 |
if movimento_camera == "Esquerda para Direita":
|
| 174 |
-
filtros_corte.append("crop=
|
| 175 |
elif movimento_camera == "Direita para Esquerda":
|
| 176 |
-
filtros_corte.append("crop=
|
| 177 |
|
| 178 |
-
# ✅ Motion Crop Inteligente
|
| 179 |
if ativar_motion_crop:
|
| 180 |
filtros_corte.append("crop=720:1280:x='abs(mod(t*100\\,main_w-w))':y='(main_h-h)/2'")
|
| 181 |
|
|
@@ -229,7 +229,7 @@ if st.button("Gerar Vídeo(s)"):
|
|
| 229 |
|
| 230 |
progresso.progress(35 + n * 5)
|
| 231 |
|
| 232 |
-
# Filtros principais sobre o vídeo
|
| 233 |
filtros_main = ["scale=720:1280:force_original_aspect_ratio=decrease"]
|
| 234 |
|
| 235 |
if zoom != 1.0:
|
|
@@ -256,19 +256,19 @@ if st.button("Gerar Vídeo(s)"):
|
|
| 256 |
"colorchannelmixer=.5:0:.5:0:.5:0:.5:0:.5:0:.5"
|
| 257 |
]))
|
| 258 |
|
| 259 |
-
# ✅ Color Space alternado
|
| 260 |
if ativar_color_space_alt:
|
| 261 |
filtros_main.append(random.choice([
|
| 262 |
-
"colorspace=
|
| 263 |
-
"colorspace=
|
| 264 |
-
"colorspace=
|
| 265 |
]))
|
| 266 |
|
| 267 |
-
# ✅ Frame Blending (
|
| 268 |
if ativar_frame_blending:
|
| 269 |
-
filtros_main.append("minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1'")
|
| 270 |
|
| 271 |
-
#
|
| 272 |
filtros_main.append("scale=trunc(iw/2)*2:trunc(ih/2)*2")
|
| 273 |
# Montar filter_complex
|
| 274 |
filtro_complex = (
|
|
@@ -375,14 +375,14 @@ if st.button("Gerar Vídeo(s)"):
|
|
| 375 |
video_final_raw
|
| 376 |
], check=True, stderr=subprocess.PIPE)
|
| 377 |
|
| 378 |
-
#
|
| 379 |
dur_proc = subprocess.run([
|
| 380 |
"ffprobe", "-v", "error", "-show_entries", "format=duration",
|
| 381 |
"-of", "default=noprint_wrappers=1:nokey=1", video_final_raw
|
| 382 |
], stdout=subprocess.PIPE)
|
| 383 |
dur_video_real = float(dur_proc.stdout.decode().strip())
|
| 384 |
|
| 385 |
-
#
|
| 386 |
if musica:
|
| 387 |
musica_path = os.path.join(temp_dir, "musica_original.mp3")
|
| 388 |
with open(musica_path, "wb") as f:
|
|
|
|
| 160 |
|
| 161 |
filtros_corte = []
|
| 162 |
|
| 163 |
+
# ✅ Zoom Progressivo (correto)
|
| 164 |
if ativar_zoom_dinamico:
|
| 165 |
filtros_corte.append(
|
| 166 |
f"zoompan=z='min(zoom+{zoom_dinamico_velocidade},1.5)':d=1:"
|
|
|
|
| 169 |
else:
|
| 170 |
filtros_corte.append("scale=trunc(iw/2)*2:trunc(ih/2)*2")
|
| 171 |
|
| 172 |
+
# ✅ Movimento de Câmera (com upscale)
|
| 173 |
if movimento_camera == "Esquerda para Direita":
|
| 174 |
+
filtros_corte.append("scale=740:1320,crop=720:1280:x='t*10':y=0")
|
| 175 |
elif movimento_camera == "Direita para Esquerda":
|
| 176 |
+
filtros_corte.append("scale=740:1320,crop=720:1280:x='(in_w-w)-t*10':y=0")
|
| 177 |
|
| 178 |
+
# ✅ Motion Crop Inteligente
|
| 179 |
if ativar_motion_crop:
|
| 180 |
filtros_corte.append("crop=720:1280:x='abs(mod(t*100\\,main_w-w))':y='(main_h-h)/2'")
|
| 181 |
|
|
|
|
| 229 |
|
| 230 |
progresso.progress(35 + n * 5)
|
| 231 |
|
| 232 |
+
# Filtros principais sobre o vídeo de cortes
|
| 233 |
filtros_main = ["scale=720:1280:force_original_aspect_ratio=decrease"]
|
| 234 |
|
| 235 |
if zoom != 1.0:
|
|
|
|
| 256 |
"colorchannelmixer=.5:0:.5:0:.5:0:.5:0:.5:0:.5"
|
| 257 |
]))
|
| 258 |
|
| 259 |
+
# ✅ Color Space alternado (corrigido)
|
| 260 |
if ativar_color_space_alt:
|
| 261 |
filtros_main.append(random.choice([
|
| 262 |
+
"colorspace=ispace=bt709:ospace=bt601",
|
| 263 |
+
"colorspace=ispace=bt709:ospace=bt470bg",
|
| 264 |
+
"colorspace=ispace=bt709:ospace=smpte240m"
|
| 265 |
]))
|
| 266 |
|
| 267 |
+
# ✅ Frame Blending (com scale antes)
|
| 268 |
if ativar_frame_blending:
|
| 269 |
+
filtros_main.append("scale=trunc(iw/2)*2:trunc(ih/2)*2,minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1'")
|
| 270 |
|
| 271 |
+
# Final padronização
|
| 272 |
filtros_main.append("scale=trunc(iw/2)*2:trunc(ih/2)*2")
|
| 273 |
# Montar filter_complex
|
| 274 |
filtro_complex = (
|
|
|
|
| 375 |
video_final_raw
|
| 376 |
], check=True, stderr=subprocess.PIPE)
|
| 377 |
|
| 378 |
+
# Obter duração real do vídeo final (após tudo)
|
| 379 |
dur_proc = subprocess.run([
|
| 380 |
"ffprobe", "-v", "error", "-show_entries", "format=duration",
|
| 381 |
"-of", "default=noprint_wrappers=1:nokey=1", video_final_raw
|
| 382 |
], stdout=subprocess.PIPE)
|
| 383 |
dur_video_real = float(dur_proc.stdout.decode().strip())
|
| 384 |
|
| 385 |
+
# Música (sincronizada com duração real)
|
| 386 |
if musica:
|
| 387 |
musica_path = os.path.join(temp_dir, "musica_original.mp3")
|
| 388 |
with open(musica_path, "wb") as f:
|