Update app.py
Browse files
app.py
CHANGED
@@ -722,7 +722,8 @@ def process_video_bg(vid, bg_type="์์", bg_image=None, bg_video=None, color=
|
|
722 |
yield None, None, f"๋น๋์ค ์ฒ๋ฆฌ ์ค๋ฅ: {e}. ๊ฒฝ๊ณผ ์๊ฐ: {elapsed_time:.2f}์ด"
|
723 |
|
724 |
@spaces.GPU(duration=180)
|
725 |
-
|
|
|
726 |
"""์ฌ๋ฌ ๋น๋์ค๋ฅผ ๋ณํฉํ๊ณ ์ค๋์ค๋ฅผ ์ถ๊ฐํ๋ ํจ์"""
|
727 |
if not video_files:
|
728 |
return None, "๋น๋์ค ํ์ผ์ ์
๋ก๋ํด์ฃผ์ธ์."
|
@@ -773,20 +774,15 @@ def merge_videos_with_audio(video_files, audio_file, audio_volume, output_fps):
|
|
773 |
logging.warning(f"๋น๋์ค ํฌ๊ธฐ๊ฐ ์๋ก ๋ค๋ฆ
๋๋ค. ์ฒซ ๋ฒ์งธ ๋น๋์ค ํฌ๊ธฐ({target_width}x{target_height})๋ก ์กฐ์ ํฉ๋๋ค.")
|
774 |
|
775 |
# ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ๋น๋์ค๋ค์ ์กฐ์
|
776 |
-
|
777 |
adjusted_clips = []
|
778 |
for clip, size in zip(video_clips, clip_sizes):
|
779 |
if size != (target_width, target_height):
|
780 |
-
# resize ํจ์๊ฐ ์์ผ๋ฉด ์ฌ์ฉ, ์์ผ๋ฉด ๋์ฒด ๋ฐฉ๋ฒ ์ฌ์ฉ
|
781 |
if resize is not None:
|
782 |
adjusted_clip = resize(clip, newsize=(target_width, target_height))
|
783 |
else:
|
784 |
-
# resize๊ฐ ์์ ๋ ๋์ฒด ๋ฐฉ๋ฒ
|
785 |
-
# clip.resize() ๋ฉ์๋ ์ฌ์ฉ ์๋
|
786 |
if hasattr(clip, 'resize'):
|
787 |
adjusted_clip = clip.resize((target_width, target_height))
|
788 |
else:
|
789 |
-
# ์ตํ์ ์๋จ: ๊ทธ๋๋ก ์ฌ์ฉ
|
790 |
adjusted_clip = clip
|
791 |
logging.warning(f"Cannot resize video. Using original size.")
|
792 |
adjusted_clips.append(adjusted_clip)
|
@@ -813,19 +809,17 @@ def merge_videos_with_audio(video_files, audio_file, audio_volume, output_fps):
|
|
813 |
if isinstance(audio_file, str):
|
814 |
audio_path = audio_file
|
815 |
else:
|
816 |
-
# gr.Audio์์ ๋ฐํ๋ ํํ์ธ ๊ฒฝ์ฐ
|
817 |
audio_path = audio_file
|
818 |
|
819 |
logging.info(f"Processing audio from: {audio_path}")
|
|
|
820 |
|
821 |
# ์ค๋์ค ๋ก๋
|
822 |
if audio_path.endswith(('.mp4', '.avi', '.mov', '.mkv')):
|
823 |
-
# ๋น๋์ค ํ์ผ์์ ์ค๋์ค ์ถ์ถ
|
824 |
temp_video = VideoFileClip(audio_path)
|
825 |
audio_clip = temp_video.audio
|
826 |
temp_video.close()
|
827 |
else:
|
828 |
-
# ์ค๋์ค ํ์ผ ์ง์ ๋ก๋
|
829 |
audio_clip = AudioFileClip(audio_path)
|
830 |
|
831 |
if audio_clip is None:
|
@@ -840,31 +834,39 @@ def merge_videos_with_audio(video_files, audio_file, audio_volume, output_fps):
|
|
840 |
audio_duration = audio_clip.duration
|
841 |
|
842 |
if audio_duration > video_duration:
|
843 |
-
# ์ค๋์ค๊ฐ ๋ ๊ธธ๋ฉด ์๋ผ๋
|
844 |
audio_clip = audio_clip.subclip(0, video_duration)
|
845 |
elif audio_duration < video_duration:
|
846 |
-
# ์ค๋์ค๊ฐ ๋ ์งง์ผ๋ฉด ๋ฐ๋ณต
|
847 |
loops_needed = int(video_duration / audio_duration) + 1
|
848 |
audio_clips_list = [audio_clip] * loops_needed
|
849 |
looped_audio = concatenate_audioclips(audio_clips_list)
|
850 |
audio_clip = looped_audio.subclip(0, video_duration)
|
851 |
|
852 |
-
#
|
853 |
-
|
854 |
-
|
855 |
-
|
856 |
-
|
857 |
-
|
858 |
-
|
859 |
-
|
860 |
-
|
861 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
862 |
|
863 |
-
logging.info("Audio successfully
|
864 |
|
865 |
except Exception as e:
|
866 |
logging.error(f"์ค๋์ค ์ฒ๋ฆฌ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}")
|
867 |
-
# ์ค๋์ค ์ฒ๋ฆฌ ์คํจํด๋ ๋น๋์ค๋ ๊ณ์ ์ฒ๋ฆฌ
|
868 |
status = f"์ค๋์ค ์ฒ๋ฆฌ ์คํจ: {str(e)}, ๋น๋์ค๋ง ๋ณํฉํฉ๋๋ค."
|
869 |
|
870 |
status = "๋น๋์ค ์ ์ฅ ์ค..."
|
@@ -879,8 +881,8 @@ def merge_videos_with_audio(video_files, audio_file, audio_volume, output_fps):
|
|
879 |
fps=output_fps,
|
880 |
codec="libx264",
|
881 |
audio_codec="aac",
|
882 |
-
preset="medium",
|
883 |
-
bitrate="5000k",
|
884 |
audio_bitrate="192k"
|
885 |
)
|
886 |
|
@@ -895,7 +897,15 @@ def merge_videos_with_audio(video_files, audio_file, audio_volume, output_fps):
|
|
895 |
audio_clip.close()
|
896 |
final_video.close()
|
897 |
|
898 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
899 |
|
900 |
except Exception as e:
|
901 |
logging.error(f"Video merge error: {str(e)}")
|
@@ -1126,7 +1136,8 @@ with demo:
|
|
1126 |
interactive=False
|
1127 |
)
|
1128 |
|
1129 |
-
|
|
|
1130 |
with gr.Tab("๋น๋์ค ํธ์ง", elem_classes="tabitem"):
|
1131 |
with gr.Row(equal_height=True):
|
1132 |
# ์
๋ ฅ ์ปฌ๋ผ
|
@@ -1134,57 +1145,59 @@ with demo:
|
|
1134 |
with gr.Group(elem_classes="panel-box"):
|
1135 |
gr.Markdown("### ๐ฅ ๋น๋์ค ์
๋ก๋ (์ต๋ 10๊ฐ)")
|
1136 |
gr.Markdown("**ํ์ผ๋ช
์ด ์์์๋ก ์ฐ์ ์์๊ฐ ๋์ต๋๋ค** (์: 1.mp4, 2.mp4, 3.mp4)")
|
1137 |
-
|
1138 |
video_files = gr.File(
|
1139 |
label="๋น๋์ค ํ์ผ๋ค",
|
1140 |
file_count="multiple",
|
1141 |
file_types=["video"],
|
1142 |
type="filepath"
|
1143 |
)
|
1144 |
-
|
1145 |
with gr.Group(elem_classes="panel-box"):
|
1146 |
gr.Markdown("### ๐ต ์ค๋์ค ์ค์ (์ ํ)")
|
1147 |
-
|
1148 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1149 |
audio_file = gr.Audio(
|
1150 |
label="์ค๋์ค ํ์ผ (MP3, WAV, M4A ๋ฑ)",
|
1151 |
type="filepath",
|
1152 |
sources=["upload"]
|
1153 |
)
|
1154 |
-
|
1155 |
audio_volume = gr.Slider(
|
1156 |
minimum=0,
|
1157 |
maximum=200,
|
1158 |
value=100,
|
1159 |
step=1,
|
1160 |
-
label="์ค๋์ค ๋ณผ๋ฅจ (%)",
|
1161 |
info="100% = ์๋ณธ ๋ณผ๋ฅจ"
|
1162 |
)
|
1163 |
-
|
1164 |
-
|
1165 |
-
|
1166 |
-
- ์ค๋์ค๊ฐ ๋น๋์ค๋ณด๋ค ์งง์ผ๋ฉด ์๏ฟฝ๏ฟฝ์ผ๋ก ๋ฐ๋ณต๋ฉ๋๋ค
|
1167 |
-
- ์ค๋์ค๊ฐ ๋น๋์ค๋ณด๋ค ๊ธธ๋ฉด ๋น๋์ค ๊ธธ์ด์ ๋ง์ถฐ ์๋ฆฝ๋๋ค
|
1168 |
-
""")
|
1169 |
-
|
1170 |
-
with gr.Group(elem_classes="panel-box"):
|
1171 |
-
gr.Markdown("### โ๏ธ ํธ์ง ์ค์ ")
|
1172 |
-
|
1173 |
-
output_fps = gr.Slider(
|
1174 |
minimum=0,
|
1175 |
-
maximum=
|
1176 |
-
value=
|
1177 |
step=1,
|
1178 |
-
label="
|
|
|
|
|
1179 |
)
|
1180 |
-
|
1181 |
gr.Markdown("""
|
1182 |
-
|
1183 |
-
-
|
1184 |
-
-
|
1185 |
-
-
|
|
|
1186 |
""")
|
1187 |
-
|
1188 |
merge_videos_btn = gr.Button("๐ฌ ๋น๋์ค ๋ณํฉ", variant="primary", elem_id="merge-btn")
|
1189 |
|
1190 |
# ์ถ๋ ฅ ์ปฌ๋ผ
|
@@ -1362,12 +1375,22 @@ with demo:
|
|
1362 |
)
|
1363 |
|
1364 |
# ์ด๋ฒคํธ ์ฐ๊ฒฐ - ๋ค ๋ฒ์งธ ํญ (๋น๋์ค ํธ์ง)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1365 |
merge_videos_btn.click(
|
1366 |
merge_videos_with_audio,
|
1367 |
-
inputs=[video_files, audio_file, audio_volume, output_fps],
|
1368 |
outputs=[merged_video, merge_status]
|
1369 |
-
)
|
1370 |
-
|
1371 |
# ์ด๋ฒคํธ ์ฐ๊ฒฐ - ๋ค์ฏ ๋ฒ์งธ ํญ (๋น๋์ค ๋ฐฐ๊ฒฝ์ ๊ฑฐ/ํฉ์ฑ)
|
1372 |
def update_bg_visibility(bg_type):
|
1373 |
if bg_type == "์์":
|
|
|
722 |
yield None, None, f"๋น๋์ค ์ฒ๋ฆฌ ์ค๋ฅ: {e}. ๊ฒฝ๊ณผ ์๊ฐ: {elapsed_time:.2f}์ด"
|
723 |
|
724 |
@spaces.GPU(duration=180)
|
725 |
+
@spaces.GPU(duration=180)
|
726 |
+
def merge_videos_with_audio(video_files, audio_file, audio_mode, audio_volume, original_audio_volume, output_fps):
|
727 |
"""์ฌ๋ฌ ๋น๋์ค๋ฅผ ๋ณํฉํ๊ณ ์ค๋์ค๋ฅผ ์ถ๊ฐํ๋ ํจ์"""
|
728 |
if not video_files:
|
729 |
return None, "๋น๋์ค ํ์ผ์ ์
๋ก๋ํด์ฃผ์ธ์."
|
|
|
774 |
logging.warning(f"๋น๋์ค ํฌ๊ธฐ๊ฐ ์๋ก ๋ค๋ฆ
๋๋ค. ์ฒซ ๋ฒ์งธ ๋น๋์ค ํฌ๊ธฐ({target_width}x{target_height})๋ก ์กฐ์ ํฉ๋๋ค.")
|
775 |
|
776 |
# ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ๋น๋์ค๋ค์ ์กฐ์
|
|
|
777 |
adjusted_clips = []
|
778 |
for clip, size in zip(video_clips, clip_sizes):
|
779 |
if size != (target_width, target_height):
|
|
|
780 |
if resize is not None:
|
781 |
adjusted_clip = resize(clip, newsize=(target_width, target_height))
|
782 |
else:
|
|
|
|
|
783 |
if hasattr(clip, 'resize'):
|
784 |
adjusted_clip = clip.resize((target_width, target_height))
|
785 |
else:
|
|
|
786 |
adjusted_clip = clip
|
787 |
logging.warning(f"Cannot resize video. Using original size.")
|
788 |
adjusted_clips.append(adjusted_clip)
|
|
|
809 |
if isinstance(audio_file, str):
|
810 |
audio_path = audio_file
|
811 |
else:
|
|
|
812 |
audio_path = audio_file
|
813 |
|
814 |
logging.info(f"Processing audio from: {audio_path}")
|
815 |
+
logging.info(f"Audio mode: {audio_mode}")
|
816 |
|
817 |
# ์ค๋์ค ๋ก๋
|
818 |
if audio_path.endswith(('.mp4', '.avi', '.mov', '.mkv')):
|
|
|
819 |
temp_video = VideoFileClip(audio_path)
|
820 |
audio_clip = temp_video.audio
|
821 |
temp_video.close()
|
822 |
else:
|
|
|
823 |
audio_clip = AudioFileClip(audio_path)
|
824 |
|
825 |
if audio_clip is None:
|
|
|
834 |
audio_duration = audio_clip.duration
|
835 |
|
836 |
if audio_duration > video_duration:
|
|
|
837 |
audio_clip = audio_clip.subclip(0, video_duration)
|
838 |
elif audio_duration < video_duration:
|
|
|
839 |
loops_needed = int(video_duration / audio_duration) + 1
|
840 |
audio_clips_list = [audio_clip] * loops_needed
|
841 |
looped_audio = concatenate_audioclips(audio_clips_list)
|
842 |
audio_clip = looped_audio.subclip(0, video_duration)
|
843 |
|
844 |
+
# ์ค๋์ค ๋ชจ๋์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ
|
845 |
+
if audio_mode == "๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฎค์ง":
|
846 |
+
# ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฎค์ง ๋ชจ๋: ๊ธฐ์กด ์ค๋์ค์ ํฉ์ฑ
|
847 |
+
if final_video.audio:
|
848 |
+
# ์๋ณธ ์ค๋์ค ๋ณผ๋ฅจ ์กฐ์
|
849 |
+
original_audio = final_video.audio
|
850 |
+
if original_audio_volume != 100:
|
851 |
+
original_audio = original_audio.volumex(original_audio_volume / 100)
|
852 |
+
|
853 |
+
# ๋ ์ค๋์ค ํฉ์ฑ
|
854 |
+
final_audio = CompositeAudioClip([original_audio, audio_clip])
|
855 |
+
final_video = final_video.set_audio(final_audio)
|
856 |
+
logging.info("Background music mode: Mixed original and new audio")
|
857 |
+
else:
|
858 |
+
# ์๋ณธ ์ค๋์ค๊ฐ ์์ผ๋ฉด ๊ทธ๋ฅ ์ถ๊ฐ
|
859 |
+
final_video = final_video.set_audio(audio_clip)
|
860 |
+
logging.info("No original audio found, adding new audio only")
|
861 |
+
else:
|
862 |
+
# ๋์ฒด ๋ชจ๋: ๊ธฐ์กด ์ค๋์ค๋ฅผ ์์ ํ ๊ต์ฒด
|
863 |
+
final_video = final_video.set_audio(audio_clip)
|
864 |
+
logging.info("Replace mode: Replaced original audio")
|
865 |
|
866 |
+
logging.info("Audio successfully processed")
|
867 |
|
868 |
except Exception as e:
|
869 |
logging.error(f"์ค๋์ค ์ฒ๋ฆฌ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}")
|
|
|
870 |
status = f"์ค๋์ค ์ฒ๋ฆฌ ์คํจ: {str(e)}, ๋น๋์ค๋ง ๋ณํฉํฉ๋๋ค."
|
871 |
|
872 |
status = "๋น๋์ค ์ ์ฅ ์ค..."
|
|
|
881 |
fps=output_fps,
|
882 |
codec="libx264",
|
883 |
audio_codec="aac",
|
884 |
+
preset="medium",
|
885 |
+
bitrate="5000k",
|
886 |
audio_bitrate="192k"
|
887 |
)
|
888 |
|
|
|
897 |
audio_clip.close()
|
898 |
final_video.close()
|
899 |
|
900 |
+
# ์ํ ๋ฉ์์ง ์์ฑ
|
901 |
+
if audio_file and audio_mode == "๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฎค์ง":
|
902 |
+
mode_msg = "๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฎค์ง ์ถ๊ฐ๋จ"
|
903 |
+
elif audio_file:
|
904 |
+
mode_msg = "์ค๋์ค ๋์ฒด๋จ"
|
905 |
+
else:
|
906 |
+
mode_msg = "์ค๋์ค ์์"
|
907 |
+
|
908 |
+
return temp_filepath, f"โ
์ฑ๊ณต์ ์ผ๋ก {len(video_paths)}๊ฐ์ ๋น๋์ค๋ฅผ ๋ณํฉํ์ต๋๋ค! (ํฌ๊ธฐ: {target_width}x{target_height}, {mode_msg})"
|
909 |
|
910 |
except Exception as e:
|
911 |
logging.error(f"Video merge error: {str(e)}")
|
|
|
1136 |
interactive=False
|
1137 |
)
|
1138 |
|
1139 |
+
|
1140 |
+
# ๋ค ๋ฒ์งธ ํญ: ๋น๋์ค ํธ์ง ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ด ์์
|
1141 |
with gr.Tab("๋น๋์ค ํธ์ง", elem_classes="tabitem"):
|
1142 |
with gr.Row(equal_height=True):
|
1143 |
# ์
๋ ฅ ์ปฌ๋ผ
|
|
|
1145 |
with gr.Group(elem_classes="panel-box"):
|
1146 |
gr.Markdown("### ๐ฅ ๋น๋์ค ์
๋ก๋ (์ต๋ 10๊ฐ)")
|
1147 |
gr.Markdown("**ํ์ผ๋ช
์ด ์์์๋ก ์ฐ์ ์์๊ฐ ๋์ต๋๋ค** (์: 1.mp4, 2.mp4, 3.mp4)")
|
1148 |
+
|
1149 |
video_files = gr.File(
|
1150 |
label="๋น๋์ค ํ์ผ๋ค",
|
1151 |
file_count="multiple",
|
1152 |
file_types=["video"],
|
1153 |
type="filepath"
|
1154 |
)
|
1155 |
+
|
1156 |
with gr.Group(elem_classes="panel-box"):
|
1157 |
gr.Markdown("### ๐ต ์ค๋์ค ์ค์ (์ ํ)")
|
1158 |
+
|
1159 |
+
# ์ค๋์ค ๋ชจ๋ ์ ํ ์ถ๊ฐ
|
1160 |
+
audio_mode = gr.Radio(
|
1161 |
+
["๋์ฒด", "๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฎค์ง"],
|
1162 |
+
label="์ค๋์ค ๋ชจ๋",
|
1163 |
+
value="๋์ฒด",
|
1164 |
+
info="๋์ฒด: ๊ธฐ์กด ์ค๋์ค๋ฅผ ์์ ํ ๊ต์ฒด | ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฎค์ง: ๊ธฐ์กด ์ค๋์ค์ ํจ๊ป ์ฌ์"
|
1165 |
+
)
|
1166 |
+
|
1167 |
audio_file = gr.Audio(
|
1168 |
label="์ค๋์ค ํ์ผ (MP3, WAV, M4A ๋ฑ)",
|
1169 |
type="filepath",
|
1170 |
sources=["upload"]
|
1171 |
)
|
1172 |
+
|
1173 |
audio_volume = gr.Slider(
|
1174 |
minimum=0,
|
1175 |
maximum=200,
|
1176 |
value=100,
|
1177 |
step=1,
|
1178 |
+
label="์ถ๊ฐ ์ค๋์ค ๋ณผ๋ฅจ (%)",
|
1179 |
info="100% = ์๋ณธ ๋ณผ๋ฅจ"
|
1180 |
)
|
1181 |
+
|
1182 |
+
# ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ชจ๋์ผ ๋๋ง ๋ณด์ด๋ ์๋ณธ ์ค๋์ค ๋ณผ๋ฅจ ์กฐ์
|
1183 |
+
original_audio_volume = gr.Slider(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1184 |
minimum=0,
|
1185 |
+
maximum=200,
|
1186 |
+
value=100,
|
1187 |
step=1,
|
1188 |
+
label="์๋ณธ ์ค๋์ค ๋ณผ๋ฅจ (%)",
|
1189 |
+
info="๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฎค์ง ๋ชจ๋์์ ์๋ณธ ๋น๋์ค ์ค๋์ค์ ๋ณผ๋ฅจ",
|
1190 |
+
visible=False
|
1191 |
)
|
1192 |
+
|
1193 |
gr.Markdown("""
|
1194 |
+
**์ค๋์ค ์ต์
**:
|
1195 |
+
- **๋์ฒด ๋ชจ๋**: ์
๋ก๋ํ ์ค๋์ค๊ฐ ๋น๋์ค์ ๊ธฐ์กด ์ค๋์ค๋ฅผ ์์ ํ ๋์ฒดํฉ๋๋ค
|
1196 |
+
- **๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฎค์ง ๋ชจ๋**: ์
๋ก๋ํ ์ค๋์ค๊ฐ ๊ธฐ์กด ์ค๋์ค์ ํจ๊ป ์ฌ์๋ฉ๋๋ค
|
1197 |
+
- ์ค๋์ค๊ฐ ๋น๋์ค๋ณด๋ค ์งง์ผ๋ฉด ์๋์ผ๋ก ๋ฐ๋ณต๋ฉ๋๋ค
|
1198 |
+
- ์ค๋์ค๊ฐ ๋น๋์ค๋ณด๋ค ๊ธธ๋ฉด ๋น๋์ค ๊ธธ์ด์ ๋ง์ถฐ ์๋ฆฝ๋๋ค
|
1199 |
""")
|
1200 |
+
|
1201 |
merge_videos_btn = gr.Button("๐ฌ ๋น๋์ค ๋ณํฉ", variant="primary", elem_id="merge-btn")
|
1202 |
|
1203 |
# ์ถ๋ ฅ ์ปฌ๋ผ
|
|
|
1375 |
)
|
1376 |
|
1377 |
# ์ด๋ฒคํธ ์ฐ๊ฒฐ - ๋ค ๋ฒ์งธ ํญ (๋น๋์ค ํธ์ง)
|
1378 |
+
|
1379 |
+
def toggle_original_volume(mode):
|
1380 |
+
return gr.update(visible=(mode == "๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฎค์ง"))
|
1381 |
+
|
1382 |
+
audio_mode.change(
|
1383 |
+
toggle_original_volume,
|
1384 |
+
inputs=[audio_mode],
|
1385 |
+
outputs=[original_audio_volume]
|
1386 |
+
)
|
1387 |
+
|
1388 |
+
|
1389 |
merge_videos_btn.click(
|
1390 |
merge_videos_with_audio,
|
1391 |
+
inputs=[video_files, audio_file, audio_mode, audio_volume, original_audio_volume, output_fps],
|
1392 |
outputs=[merged_video, merge_status]
|
1393 |
+
)
|
|
|
1394 |
# ์ด๋ฒคํธ ์ฐ๊ฒฐ - ๋ค์ฏ ๋ฒ์งธ ํญ (๋น๋์ค ๋ฐฐ๊ฒฝ์ ๊ฑฐ/ํฉ์ฑ)
|
1395 |
def update_bg_visibility(bg_type):
|
1396 |
if bg_type == "์์":
|