| | import gradio as gr |
| | import cv2 |
| | import numpy as np |
| | import ffmpeg |
| |
|
| | def resize_and_stretch_ffmpeg(video_path, direction): |
| | """ |
| | Уменьшает видео по горизонтали или вертикали на 25%, а затем растягивает обратно с помощью интерполяции Ланцоша, используя ffmpeg. |
| | |
| | Args: |
| | video_path: Путь к видеофайлу. |
| | direction: Направление сжатия ("horizontal" или "vertical"). |
| | |
| | Returns: |
| | Путь к обработанному видеофайлу. |
| | """ |
| |
|
| | output_path = "output_video_ffmpeg.mp4" |
| |
|
| | |
| | probe = ffmpeg.probe(video_path) |
| | video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None) |
| | width = int(video_stream['width']) |
| | height = int(video_stream['height']) |
| |
|
| | |
| | if direction == "horizontal": |
| | new_width = int(width * 0.75) |
| | new_height = height |
| | scale_down_filter = f"scale={new_width}:{new_height}:flags=lanczos" |
| | scale_up_filter = f"scale={width}:{height}:flags=lanczos" |
| | else: |
| | new_width = width |
| | new_height = int(height * 0.75) |
| | scale_down_filter = f"scale={new_width}:{new_height}:flags=lanczos" |
| | scale_up_filter = f"scale={width}:{height}:flags=lanczos" |
| |
|
| | try: |
| | ( |
| | ffmpeg |
| | .input(video_path) |
| | .filter('scale', new_width, new_height, flags='lanczos') |
| | .filter('scale', width, height, flags='lanczos') |
| | .output(output_path, vcodec='libx264', crf=28) |
| | .run(capture_stdout=True, capture_stderr=True) |
| | ) |
| | except ffmpeg.Error as e: |
| | print('stdout:', e.stdout.decode('utf8')) |
| | print('stderr:', e.stderr.decode('utf8')) |
| | raise e |
| |
|
| | return output_path |
| |
|
| | |
| | iface = gr.Interface( |
| | fn=resize_and_stretch_ffmpeg, |
| | inputs=[ |
| | gr.Video(label="Загрузите видео"), |
| | gr.Radio(["horizontal", "vertical"], label="Направление сжатия") |
| | ], |
| | outputs=gr.Video(label="Обработанное видео"), |
| | title="Сжатие и растягивание видео", |
| | description="Загрузите видео, выберите направление сжатия (горизонтальное или вертикальное), и программа уменьшит его размер на 25% в этом направлении, а затем растянет обратно с помощью интерполяции Ланцоша (с использованием ffmpeg)." |
| | ) |
| |
|
| | iface.launch() |