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:
|