Safemotion Lib
Loading...
Searching...
No Matches
utils_video.py
Go to the documentation of this file.
1from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
2from moviepy.editor import VideoFileClip
3from moviepy.editor import ImageSequenceClip
4
5from smutils.utils_os import search_file
6
7def crop_clip(input_video_path, output_video_path, crop_area, time_interval=[0, -1], interver_type='time'):
8 """
9 동영상에서 특정 영역및 시간 범위를 잘라서 저장하는 기능
10 args:
11 input_video_path (str): 입력 동영상 경로
12 output_video_path (str): 동영상을 저장할 경로
13 crop_area (list[int] or tuple) : 동영상에서 잘라낼 영역의 좌상단과 우하단 좌표 (x1, y1, x2, y2)
14 time_interval (list or tuple): 동영상에서 잘라낼 시작 구간과 종료 구간 (시작 구간, 종료 구간)
15 interver_type : time_interval 단위
16 'time' : 초단위, 소수점 입력 가능
17 'frame' : 프레임 단위, 정수로 입력
18 """
19
20 # 동영상 읽기
21 clip = VideoFileClip(input_video_path)
22
23 # 구간 설정
24 start_time, end_time = time_interval
25 if interver_type == 'frame':
26 fps = clip.fps
27 start_time = start_time / fps
28 end_time = end_time / fps
29
30 # 지정한 시간 구간을 잘라내기
31 subclip = clip.subclip(start_time, end_time)
32
33 # 지정한 영역을 잘라내기
34 cropped_clip = subclip.crop(y1=crop_area[1], y2=crop_area[3], x1=crop_area[0], x2=crop_area[2])
35
36 # 잘라낸 영역을 새 동영상 파일로 저장
37 cropped_clip.write_videofile(output_video_path, codec="libx264")
38
39 # 자원 해제
40 clip.close()
41
42
43def make_video(folder_or_paths, save_path, fps=30, half=True):
44 """
45 이미지를 기반으로 동영상을 생성하는 기능
46 args:
47 folder_or_paths (str or list[str]): 동영상을 만들 이미지가 저장된 폴더 또는 이미지 경로 리스트
48 save_path (str): 동영상을 저장할 경로
49 fps (int): 생성할 동영상의 프레임 속도
50 half (bool): 이미지의 크기를 절반으로 줄여서 저장할지 여부
51 """
52
53 #이미지 경로 설정
54 if isinstance(folder_or_paths, str):
55 _, path_list = search_file(folder_or_paths, '.jpg')
56 else:
57 path_list = folder_or_paths
58
59 # 이미지 시퀀스로부터 동영상 클립 생성
60 clip = ImageSequenceClip(path_list, fps=fps)
61
62 # 크기를 절반으로 줄이는 옵션이 활성화된 경우, 크기를 조절합니다.
63 if half:
64 clip = clip.resize(height=int(clip.h/2), width=int(clip.w/2))
65
66 # 동영상 파일로 저장
67 clip.write_videofile(save_path, codec='libx264', bitrate='4000k')
68
69 # 자원 해제
70 clip.close()
71
crop_clip(input_video_path, output_video_path, crop_area, time_interval=[0, -1], interver_type='time')
Definition utils_video.py:7
make_video(folder_or_paths, save_path, fps=30, half=True)