CoolFace
Apppublic

jerzes/sfmlstrminglxj9f2v-2da

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
command.py164 linesDownload Raw Back to root
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