Serg4451D commited on
Commit
9e605f0
·
verified ·
1 Parent(s): cb2d854

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +29 -33
app.py CHANGED
@@ -1,10 +1,11 @@
1
  import gradio as gr
2
  import cv2
3
  import numpy as np
 
4
 
5
- def resize_and_stretch(video_path, direction):
6
  """
7
- Уменьшает видео по горизонтали или вертикали на 25%, а затем растягивает обратно с помощью интерполяции Ланцоша.
8
 
9
  Args:
10
  video_path: Путь к видеофайлу.
@@ -14,57 +15,52 @@ def resize_and_stretch(video_path, direction):
14
  Путь к обработанному видеофайлу.
15
  """
16
 
17
- cap = cv2.VideoCapture(video_path)
18
- if not cap.isOpened():
19
- raise ValueError("Не удалось открыть видеофайл.")
20
 
21
- # Получаем свойства видео
22
- fps = cap.get(cv2.CAP_PROP_FPS)
23
- width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
24
- height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
 
25
 
26
  # Вычисляем новые размеры
27
  if direction == "horizontal":
28
  new_width = int(width * 0.75)
29
  new_height = height
 
 
30
  else: # vertical
31
  new_width = width
32
  new_height = int(height * 0.75)
 
 
33
 
34
- # Создаем объект VideoWriter для записи выходного видео
35
- fourcc = cv2.VideoWriter_fourcc(*'mp4v') # Или используйте другой кодек, если нужно
36
- output_path = "output_video.mp4"
37
- out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
38
-
39
- while True:
40
- ret, frame = cap.read()
41
- if not ret:
42
- break
43
-
44
- # Уменьшаем размер кадра
45
- resized_frame = cv2.resize(frame, (new_width, new_height), interpolation=cv2.INTER_LANCZOS4)
46
-
47
- # Растягиваем обратно с помощью интерполяции Ланцоша
48
- stretched_frame = cv2.resize(resized_frame, (width, height), interpolation=cv2.INTER_LANCZOS4)
49
-
50
- # Записываем кадр в выходное видео
51
- out.write(stretched_frame)
52
-
53
- cap.release()
54
- out.release()
55
 
56
  return output_path
57
 
58
- # Создаем интерфейс Gradio
59
  iface = gr.Interface(
60
- fn=resize_and_stretch,
61
  inputs=[
62
  gr.Video(label="Загрузите видео"),
63
  gr.Radio(["horizontal", "vertical"], label="Направление сжатия")
64
  ],
65
  outputs=gr.Video(label="Обработанное видео"),
66
  title="Сжатие и растягивание видео",
67
- description="Загрузите видео, выберите направление сжатия (горизонтальное или вертикальное), и программа уменьшит его размер на 25% в этом направлении, а затем растянет обратно с помощью интерполяции Ланцоша."
68
  )
69
 
70
  iface.launch()
 
1
  import gradio as gr
2
  import cv2
3
  import numpy as np
4
+ import ffmpeg
5
 
6
+ def resize_and_stretch_ffmpeg(video_path, direction):
7
  """
8
+ Уменьшает видео по горизонтали или вертикали на 25%, а затем растягивает обратно с помощью интерполяции Ланцоша, используя ffmpeg.
9
 
10
  Args:
11
  video_path: Путь к видеофайлу.
 
15
  Путь к обработанному видеофайлу.
16
  """
17
 
18
+ output_path = "output_video_ffmpeg.mp4"
 
 
19
 
20
+ # Получаем свойства видео с помощью ffprobe
21
+ probe = ffmpeg.probe(video_path)
22
+ video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None)
23
+ width = int(video_stream['width'])
24
+ height = int(video_stream['height'])
25
 
26
  # Вычисляем новые размеры
27
  if direction == "horizontal":
28
  new_width = int(width * 0.75)
29
  new_height = height
30
+ scale_down_filter = f"scale={new_width}:{new_height}:flags=lanczos"
31
+ scale_up_filter = f"scale={width}:{height}:flags=lanczos"
32
  else: # vertical
33
  new_width = width
34
  new_height = int(height * 0.75)
35
+ scale_down_filter = f"scale={new_width}:{new_height}:flags=lanczos"
36
+ scale_up_filter = f"scale={width}:{height}:flags=lanczos"
37
 
38
+ try:
39
+ (
40
+ ffmpeg
41
+ .input(video_path)
42
+ .filter('scale', new_width, new_height, flags='lanczos')
43
+ .filter('scale', width, height, flags='lanczos')
44
+ .output(output_path, vcodec='libx264', crf=28) #Измените кодек и параметр crf при необходимости
45
+ .run(capture_stdout=True, capture_stderr=True)
46
+ )
47
+ except ffmpeg.Error as e:
48
+ print('stdout:', e.stdout.decode('utf8'))
49
+ print('stderr:', e.stderr.decode('utf8'))
50
+ raise e
 
 
 
 
 
 
 
 
51
 
52
  return output_path
53
 
54
+ # Создаем интерфейс Gradio (остается таким же, как и в первом примере)
55
  iface = gr.Interface(
56
+ fn=resize_and_stretch_ffmpeg,
57
  inputs=[
58
  gr.Video(label="Загрузите видео"),
59
  gr.Radio(["horizontal", "vertical"], label="Направление сжатия")
60
  ],
61
  outputs=gr.Video(label="Обработанное видео"),
62
  title="Сжатие и растягивание видео",
63
+ description="Загрузите видео, выберите направление сжатия (горизонтальное или вертикальное), и программа уменьшит его размер на 25% в этом направлении, а затем растянет обратно с помощью интерполяции Ланцоша (с использованием ffmpeg)."
64
  )
65
 
66
  iface.launch()