jerzes/sfmlstrminglxj9f2v-2da
0
1import subprocess
2from PIL import Image
3from pydantic import BaseModel, ValidationError
4import os
5import requests
6from urllib.parse import urlsplit
7
8def url_to_file(url,file_name,ext):
9 try:
10 response = requests.get(url)
11 if response.status_code == 200:
12 content_type = ext
13 if 'image' in content_type:
14 file_extension = '.' + content_type.split('/')[1]
15 elif 'video' in content_type:
16 file_extension = '.' + content_type.split('/')[1]
17 elif 'pdf' in content_type:
18 file_extension = '.pdf'
19 elif 'text' in content_type:
20 file_extension = '.txt'
21 else:
22 file_extension = '.bin'
23 file_name = file_name + file_extension
24 with open(file_name, 'wb') as file:
25 file.write(response.content)
26 print(f"Tệp đã được tải xuống thành công và lưu thành {file_name}.")
27 return file_name
28 else:
29 print(f"Lỗi tải tệp: {response.status_code}")
30 except:
31 print('Can\'t download file')
32 return False
33class Obj1(BaseModel):
34 image_path:str
35 point_a:tuple[int,int]
36 point_b:tuple[int,int]
37 point_c:tuple[int,int]
38 start_time:int
39 time_a_b:int
40 time_hold_at_b:int
41 time_b_c:int
42class FFMPEG_CMD:
43 def __init__(self):
44 pass
45 def create_ffmpeg_command_with_repeat(input_video,rtmp_url,obj:Obj1,repeat_time=1,repeat_each=10):
46 if obj.image_path:
47 xA, yA = obj.point_a
48 xB, yB = obj.point_b
49 xC, yC = obj.point_c # Thay thế bằng đường dẫn tới ảnh của bạn
50 start_time=obj.start_time
51 time_a_b=obj.time_a_b
52 time_hold_at_b=obj.time_hold_at_b
53 time_b_c=obj.time_b_c
54 duration=time_hold_at_b+time_a_b+time_b_c
55 image = Image.open(obj.image_path)
56 width, height = image.size
57 st=''
58 if repeat_time>1:
59 for i in range(repeat_time):
60 start_time=start_time if i==0 else start_time+duration+repeat_each
61 st+=f"""{'[0][1]' if i==0 else f'[out{i-1}][1]'}overlay=enable='between(t,{start_time},{start_time+duration})':x='if(lt(t,{start_time+time_a_b}), {xA+width} + ({xB}-{xA+width})*(t-{start_time})/{time_a_b}, if(lt(t,{start_time+duration-time_a_b}), {xB}, {xB} + ({xC}-{xB+width})*(t-{start_time+duration-time_a_b})/{time_b_c}))':y='if(lt(t,{start_time+time_a_b}), {yA} + ({yB}-{yA})*(t-{start_time})/{time_a_b}, if(lt(t,{start_time+duration-time_a_b}), {yB}, {yB} + ({yC}-{yB})*(t-{start_time+duration-time_a_b})/{time_b_c}))'[out{i if i !=repeat_time-1 else ''}];
62 """
63 else:
64 st=f"""[0][1]overlay=enable='between(t,{start_time},{start_time+duration})':x='if(lt(t,{start_time+time_a_b}), {xA+width} + ({xB}-{xA+width})*(t-{start_time})/{time_a_b}, if(lt(t,{start_time+duration-time_a_b}), {xB}, {xB} + ({xC}-{xB+width})*(t-{start_time+duration-time_a_b})/{time_b_c}))':y='if(lt(t,{start_time+time_a_b}), {yA} + ({yB}-{yA})*(t-{start_time})/{time_a_b}, if(lt(t,{start_time+duration-time_a_b}), {yB}, {yB} + ({yC}-{yB})*(t-{start_time+duration-time_a_b})/{time_b_c}))';
65 """
66 ffmpeg_command = ['ffmpeg']
67 if obj.image_path:
68 if repeat_time==1:
69 ffmpeg_command+=['-re']
70 ffmpeg_command+=[
71 '-i', f'{input_video}',
72 '-i', f'{obj.image_path}',
73 '-filter_complex', f'{st.strip()}']
74 if repeat_time>1:
75 ffmpeg_command+=['-map','[out]']
76 else:
77 ffmpeg_command+=["-vf", "format=yuv420p"]
78 ffmpeg_command+=[
79 '-c:v', 'libx264',
80 '-preset', 'veryfast',
81 '-maxrate', '3000k',
82 '-bufsize', '6000k',
83 '-pix_fmt', 'yuv420p',
84 '-g', '50',
85 '-c:a', 'aac',
86 '-b:a', '128k',
87 '-ar', '44100',
88 '-f', 'flv',
89 f'{rtmp_url}'
90 ]
91 return ffmpeg_command
92 def create_ffmpeg_command_with_multi_items(input_video,rtmp_url,array_object):
93 if len(array_object)>1:
94 last_output=None
95 first_output=None
96 st=''
97 arr=[]
98 for idx,obj in enumerate(array_object):
99 xA, yA = obj.point_a
100 xB, yB = obj.point_b
101 xC, yC = obj.point_c
102 start_time=obj.start_time
103 time_a_b=obj.time_a_b
104 time_hold_at_b=obj.time_hold_at_b
105 time_b_c=obj.time_b_c
106 duration=time_hold_at_b+time_a_b+time_b_c
107 image = Image.open(obj.image_path)
108 width, height = image.size
109 repeat_time=obj.repeat_time
110 repeat_each=obj.repeat_each
111 st=f'movie={obj.image_path}[img{idx}];'
112 for i in range(repeat_time):
113 start_time=start_time if i==0 else start_time+duration+repeat_each
114 it=f"""overlay=enable='between(t,{start_time},{start_time+duration})':x='if(lt(t,{start_time+time_a_b}), {xA+width} + ({xB}-{xA+width})*(t-{start_time})/{time_a_b}, if(lt(t,{start_time+duration-time_a_b}), {xB}, {xB} + ({xC}-{xB+width})*(t-{start_time+duration-time_a_b})/{time_b_c}))':y='if(lt(t,{start_time+time_a_b}), {yA} + ({yB}-{yA})*(t-{start_time})/{time_a_b}, if(lt(t,{start_time+duration-time_a_b}), {yB}, {yB} + ({yC}-{yB})*(t-{start_time+duration-time_a_b})/{time_b_c}))'
115 """
116 arr.append(it)
117 big_st=''
118 for i,item in enumerate(arr):
119 big_st+=f"[0][img{idx}]"+item+'[]'
120 else:
121 xA, yA = obj.point_a
122 xB, yB = obj.point_b
123 xC, yC = obj.point_c
124 start_time=obj.start_time
125 time_a_b=obj.time_a_b
126 time_hold_at_b=obj.time_hold_at_b
127 time_b_c=obj.time_b_c
128 duration=time_hold_at_b+time_a_b+time_b_c
129 image = Image.open(obj.image_path)
130 width, height = image.size
131 repeat_time=obj.repeat_time
132 repeat_each=obj.repeat_each
133 st=f'movie={obj.image_path}[img];'
134 if repeat_time>1:
135 for i in range(repeat_time):
136 start_time=start_time if i==0 else start_time+duration+repeat_each
137 st+=f"""{'[0][img]' if i==0 else f'[out{i-1}][1]'}overlay=enable='between(t,{start_time},{start_time+duration})':x='if(lt(t,{start_time+time_a_b}), {xA+width} + ({xB}-{xA+width})*(t-{start_time})/{time_a_b}, if(lt(t,{start_time+duration-time_a_b}), {xB}, {xB} + ({xC}-{xB+width})*(t-{start_time+duration-time_a_b})/{time_b_c}))':y='if(lt(t,{start_time+time_a_b}), {yA} + ({yB}-{yA})*(t-{start_time})/{time_a_b}, if(lt(t,{start_time+duration-time_a_b}), {yB}, {yB} + ({yC}-{yB})*(t-{start_time+duration-time_a_b})/{time_b_c}))'[out{i if i !=repeat_time-1 else ''}];
138 """
139 else:
140 st+=f"""[0][img]overlay=enable='between(t,{start_time},{start_time+duration})':x='if(lt(t,{start_time+time_a_b}), {xA+width} + ({xB}-{xA+width})*(t-{start_time})/{time_a_b}, if(lt(t,{start_time+duration-time_a_b}), {xB}, {xB} + ({xC}-{xB+width})*(t-{start_time+duration-time_a_b})/{time_b_c}))':y='if(lt(t,{start_time+time_a_b}), {yA} + ({yB}-{yA})*(t-{start_time})/{time_a_b}, if(lt(t,{start_time+duration-time_a_b}), {yB}, {yB} + ({yC}-{yB})*(t-{start_time+duration-time_a_b})/{time_b_c}))'[out];
141 """
142 ffmpeg_command = ['ffmpeg']
143 if repeat_time==1:
144 ffmpeg_command+=['-re']
145 ffmpeg_command+=[
146 '-i', input_video,
147 '-i', obj.image_path,
148 '-filter_complex', st]
149 ffmpeg_command+=['-map','[out]']
150 ffmpeg_command+=[
151 '-c:v', 'libx264',
152 '-preset', 'veryfast',
153 '-maxrate', '3000k',
154 '-bufsize', '6000k',
155 '-pix_fmt', 'yuv420p',
156 '-g', '50',
157 '-c:a', 'aac',
158 '-b:a', '128k',
159 '-ar', '44100',
160 '-f', 'flv',
161 rtmp_url
162 ]
163 return ffmpeg_command
164 