File size: 3,336 Bytes
5f685fd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
import ffmpeg
import os
import random
import yt_dlp
import subprocess
import json
def getYoutubeVideoLink(url):
if 'shorts' in url:
ydl_opts = {
"quiet": True,
"no_warnings": True,
"no_color": True,
"no_call_home": True,
"no_check_certificate": True,
"format": "bestvideo[height<=1920]"
}
else:
ydl_opts = {
"quiet": True,
"no_warnings": True,
"no_color": True,
"no_call_home": True,
"no_check_certificate": True,
"format": "bestvideo[height<=1080]"
}
try:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
dictMeta = ydl.extract_info(
url,
download=False)
return dictMeta['url'], dictMeta['duration']
except Exception as e:
print("Failed getting video link from the following video/url", e.args[0])
return None, None
def extract_random_clip_from_video(video_url, video_duration, clip_duration , output_file):
print(video_url, video_duration, clip_duration , output_file)
"""Extracts a clip from a video using a signed URL.
Args:
video_url (str): The signed URL of the video.
video_url (int): Duration of the video.
start_time (int): The start time of the clip in seconds.
clip_duration (int): The duration of the clip in seconds.
output_file (str): The output file path for the extracted clip.
"""
if not video_duration:
raise Exception("Could not get video duration")
if not video_duration*0.7 > 120:
raise Exception("Video too short")
start_time = video_duration*0.15 + random.random()* (0.7*video_duration-clip_duration)
(
ffmpeg
.input(video_url, ss=start_time, t=clip_duration)
.output(output_file, codec="libx264", preset="ultrafast")
.run()
)
if not os.path.exists(output_file):
raise Exception("Random clip failed to be written")
return output_file
def get_aspect_ratio(video_file):
cmd = 'ffprobe -i "{}" -v quiet -print_format json -show_format -show_streams'.format(video_file)
# jsonstr = subprocess.getoutput(cmd)
jsonstr = subprocess.check_output(cmd, shell=True, encoding='utf-8')
r = json.loads(jsonstr)
# look for "codec_type": "video". take the 1st one if there are mulitple
video_stream_info = [x for x in r['streams'] if x['codec_type']=='video'][0]
if 'display_aspect_ratio' in video_stream_info and video_stream_info['display_aspect_ratio']!="0:1":
a,b = video_stream_info['display_aspect_ratio'].split(':')
dar = int(a)/int(b)
else:
# some video do not have the info of 'display_aspect_ratio'
w,h = video_stream_info['width'], video_stream_info['height']
dar = int(w)/int(h)
## not sure if we should use this
#cw,ch = video_stream_info['coded_width'], video_stream_info['coded_height']
#sar = int(cw)/int(ch)
if 'sample_aspect_ratio' in video_stream_info and video_stream_info['sample_aspect_ratio']!="0:1":
# some video do not have the info of 'sample_aspect_ratio'
a,b = video_stream_info['sample_aspect_ratio'].split(':')
sar = int(a)/int(b)
else:
sar = dar
par = dar/sar
return dar |