Spaces:
No application file
No application file
| import shlex | |
| import subprocess | |
| from tempfile import NamedTemporaryFile | |
| from gradio_client.client import DEFAULT_TEMP_DIR | |
| import gradio | |
| from setup_tools.os import is_windows | |
| def run_command(command) -> subprocess.CompletedProcess: | |
| if not is_windows(): | |
| command = shlex.split(command) | |
| return subprocess.run(command) | |
| def clear(count): | |
| return [None]*count | |
| def image_audio(): | |
| with gradio.Row(): | |
| with gradio.Column(): | |
| image = gradio.Image(label='Image', type='filepath') | |
| audio = gradio.Audio(label='Audio', type='filepath') | |
| output = gradio.PlayableVideo(label='Output video') | |
| with gradio.Row(): | |
| combine_button = gradio.Button('Combine', variant='primary') | |
| clear_button = gradio.Button('Clear') | |
| def image_audio_func(i, a): | |
| out_file = NamedTemporaryFile(delete=False, suffix='.mp4').name | |
| result = run_command(f'ffmpeg -y -loop 1 -i "{i}" -i "{a}" -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest "{out_file}"') | |
| assert result.returncode == 0 | |
| return out_file | |
| combine_button.click(fn=image_audio_func, inputs=[image, audio], outputs=output) | |
| clear_button.click(fn=lambda: clear(3), outputs=[image, audio, output]) | |
| def video_audio(): | |
| with gradio.Row(): | |
| with gradio.Column(): | |
| video = gradio.Video(label='Video') | |
| audio = gradio.Audio(label='Audio', type='filepath') | |
| output = gradio.PlayableVideo(label='Output video') | |
| with gradio.Row(): | |
| combine_button = gradio.Button('Combine', variant='primary') | |
| clear_button = gradio.Button('Clear') | |
| def image_audio_func(v, a): | |
| out_file = NamedTemporaryFile(dir=DEFAULT_TEMP_DIR, delete=False, suffix='.mp4').name | |
| result = run_command(f'ffmpeg -y -i "{v}" -i "{a}" -c:v copy -map 0:v:0 -map 1:a:0 -c:a aac -b:a 192k -shortest "{out_file}"') | |
| assert result.returncode == 0 | |
| return out_file | |
| combine_button.click(fn=image_audio_func, inputs=[video, audio], outputs=output) | |
| clear_button.click(fn=lambda: clear(3), outputs=[video, audio, output]) | |
| def video_strip(): | |
| with gradio.Row(): | |
| video = gradio.File(label='Video or other file with audio.') | |
| output = gradio.Audio(label='Audio', interactive=False) | |
| with gradio.Row(): | |
| strip_button = gradio.Button('Strip', variant='primary') | |
| clear_button = gradio.Button('Clear') | |
| def strip(a): | |
| out_file = NamedTemporaryFile(dir=DEFAULT_TEMP_DIR, delete=False, suffix='.wav').name | |
| result = run_command(f'ffmpeg -y -i "{a.name}" "{out_file}"') | |
| assert result.returncode == 0 | |
| return out_file | |
| strip_button.click(fn=strip, inputs=video, outputs=output) | |
| clear_button.click(fn=lambda: clear(2), outputs=[video, output]) | |
| def ffmpeg_utils_tab(): | |
| with gradio.Tabs(): | |
| with gradio.Tab('π½ = π'): | |
| video_strip() | |
| with gradio.Tab('π· + π = π½'): | |
| image_audio() | |
| with gradio.Tab('π½ + π = π½'): | |
| video_audio() | |