def create_mp4(video, audio, save_path=None): audio = AudioFileClip(audio) if audio is not None else None fps = video.shape[0] / audio.duration imageio.mimsave("backend_files/mute.mp4", video) video = VideoFileClip("backend_files/mute.mp4", audio=False) video.set_audio(audio) if save_path is not None: video.write_videofile(save_path, fps=fps) # , codec='mpeg4') return video
def handleDLToMp4(self): try: appStatus.set('[1/2] Downloading...') root.update() getYTVideo = YouTube(ytLink.get()) composedFilePath = f'{self.usrDownloadPath}{sep}{getYTVideo.title}.mp4' getYTVideo.streams.filter(adaptive=True, type='video').first().download( self.usrDownloadPath, filename='tmpVidFile') getYTVideo.streams.filter(adaptive=True, type='audio').first().download( self.usrDownloadPath, filename='tmpAudFile') tmpVideoFile = VideoFileClip(self.tmpVideoFilePath) tmpAudioFile = AudioFileClip(self.tmpAudioFilePath) appStatus.set('[2/2] Converting & mounting file...') ytLink.set('This step may take some minutes') root.update() mountClip = tmpVideoFile.set_audio(tmpAudioFile) mountClip.write_videofile(composedFilePath, fps=30) tmpVideoFile.close() tmpAudioFile.close() remove(self.tmpVideoFilePath) remove(self.tmpAudioFilePath) appStatus.set('Done!') ytLink.set('Check your "Downloads" directory.') root.update() except Exception as e: print(e) appStatus.set('Whoops, something went wrong!') ytLink.set(value='Invalid link!') root.update()
def saveVideo(self): count = 0 four_cc = cv2.VideoWriter_fourcc(*'DIVX') name = QFileDialog.getSaveFileName(self, "Save File", "output.avi", "Videos(*.avi)") # if user doesn't select file directory if not name[0]: return out = cv2.VideoWriter(name[0], four_cc, self.fps, (int(self.w), int(self.h))) self.progress.setMaximum(len(self.frameList)) while count < len(self.frameList): (ret, frame) = self.frameList[count] if ret: count += 1 out.write(frame) self.progress.setValue(count) else: break out.release() audio = AudioFileClip(self.name) video = VideoFileClip(name[0]) result = video.set_audio(audio) result.write_videofile(name[0].replace(".avi", ".mp4"))
def add_music( self ): #Creates a new video file from the temporary output file and adds the selected audio the the background. my_clip = VideoFileClip("".join(self.save_path.split(".")[:-1]) + "_tmp.avi") music = AudioFileClip(self.mus_path) if my_clip.duration > music.duration: duration = music.duration else: duration = my_clip.duration my_clip = my_clip.set_audio(music.set_duration(duration)) my_clip.write_videofile(self.save_path, fps=self.fps)
def download_and_convert(url): print("converting url " + url) source = pafy.new(url) best = source.getbest(preftype="mp4") ts = datetime.datetime.fromtimestamp(time.time()).strftime('%Y%m%d-%H%M%S') input_filename = "/tmp/" + ts + "." + best.extension best.download(filepath=input_filename) output = VideoFileClip(input_filename) duration = output.duration output_filename="/tmp/" + best.title + "." + best.extension output = output.set_audio(audio).fl_time(lambda t: t * accel, apply_to='mask').set_duration(duration / accel) output.write_videofile(output_filename) print("uploading to s3") s3 = boto.connect_s3() bucket = s3.get_bucket('bennyhill') key = Key(bucket) key.key = best.title + "-" + ts key.set_contents_from_filename(output_filename) output_url = key.generate_url(expires_in=3600) print("complete") # save the results try: result = Result( url=url, youtube_url=output_url ) db.session.add(result) db.session.commit() return result.id except: errors.append("Unable to add item to database.") return {"error": errors}
def get_reddit_videos(subreddit, count, folder): r = praw.Reddit(client_id="Oez4fMric1z1uQ", client_secret="3-IOEjlgneiGBeNT02yeZ3TDLL1asw", user_agent="idk") counter = 0 sub = r.subreddit(subreddit).hot(limit=count * 10) temp_dict = [] titles = [] times = [] with open("videos.json", "r") as json_file: data = json.load(json_file) existing_titles = data["titles"] print(existing_titles) if folder != "": folder = folder + "/" for post in sub: if counter > (count - 1): break if post.is_video and not post.over_18 and not post.title in existing_titles: vid_link = post.media['reddit_video']['fallback_url'] audio_link = f'{vid_link.split("_")[0]}_audio.mp4' #print(audio_link) #print(vid_link) print(f'{folder}{post.title}.mp4') try: beginning = time.perf_counter() title = post.title.replace(":", "_colon_") title = title.replace("?", "") urllib.request.urlretrieve(vid_link, f'{folder}{title}.mp4') urllib.request.urlretrieve(audio_link, f'{folder}{title}.mp3') vid = VideoFileClip(f'{folder}{title}.mp4') audio = AudioFileClip(f'{folder}{title}.mp3') combined_vid = vid.set_audio(audio) combined_vid.write_videofile(f'{folder}final {title}.mp4') temp_dict.append({ "video_title": f'{folder}final {title}.mp4', "duration": post.media['reddit_video']["duration"], "used": False, "url": post.url, "source": "reddit", "score": post.score, "tags": [] }) counter += 1 print(f"-----DOWNLOADED VIDEO {counter} OF {count}-----") times.append(time.perf_counter() - beginning) titles.append(post.title) except: print("Exception at download") traceback.print_exc() with open("videos.json", "r") as json_file: data = json.load(json_file) video_list = [] for i in data["data"]: video_list.append(i["video_title"]) for i in temp_dict: if not i["video_title"] in video_list: data["data"].insert(0, i) data["total_duration"] += i["duration"] data["usable_duration"] += i["duration"] data["time_downloading"] += sum(times) data["downloads"] += len(times) data["average_download_time"] = data["time_downloading"] / data[ "downloads"] for i in titles: data["titles"].append(i) print(temp_dict) with open("videos.json", "w") as json_f: json.dump(data, json_f, indent=2) #get_reddit_videos("dankvideos", 100,"meme storage")
def GetVideo(): vedio2 = VideoFileClip(r"F:\IDM下载内容保存\you-get\呆妹儿小霸王.mp4") toalvideo = vedio2.set_audio("F:\IDM下载内容保存\you-get\【Douyu】呆妹儿小霸王.m4a") toalvideo.write_videofile(r"J:\vedio\daimei——hecheng.mp4")
logosize = im_temp.textsize(text=series_txt, font=ImageFont.truetype('./font/Alibaba-PuHuiTi-Regular.ttf', 20)) image.close() image = Image.new(mode='RGBA', size=logosize) draw_table = ImageDraw.Draw(im=image) draw_table.text(xy=(0, 0), text=series_txt, fill='#FFFFFF', font=ImageFont.truetype('./font/Alibaba-PuHuiTi-Regular.ttf', 20)) image.save('./logo/text_logo.png', 'PNG') image.close() video_name = filename video_path = './video/'+video_name video = VideoFileClip(video_path) if video.audio is None: video = VideoFileClip(video_path) else: newaudio = video.audio.fx(volumex,0) video = video.set_audio(newaudio) logo = ( ImageClip(logo_path) .set_duration(video.duration) .resize(height=50) .set_pos(("left", "top")) ) text = ( ImageClip("./logo/text_logo.png") .set_duration(video.duration) .resize(height=20) .set_pos(("right", "bottom")) ) #txt = TextClip(series_txt, color='white', font = './font/Alibaba-PuHuiTi-Regular.ttf', fontsize=20).set_pos(('right', 'bottom')).set_duration(video.duration) #final = CompositeVideoClip([video, logo, txt]) final = CompositeVideoClip([video, logo, text])
def download(self): url = self.url_line_edit.text() target_dir = self.folder_line_edit.text() quality = str(self.quality_combo_box.currentText()) is_v, is_p = self.is_v(url), self.is_p(url) if is_p: playlist = pt.Playlist(url) iter_things = playlist.video_urls elif is_v: iter_things = [url] else: self.url_line_edit.setText("Please enter a valid url") return if not target_dir: self.folder_line_edit.setText("Please choose a directory") return if quality == SELECT_QUALITY_PROMPT_STRING: return self.title_label.setText("") self.title_label.setText("Downloading..") self.message_label.setHidden(False) self.quality_combo_box.setHidden(True) self.folder_line_edit.setHidden(True) self.queue_push_button.setHidden(True) self.select_folder_push_button.setHidden(True) self.url_line_edit.setHidden(True) self.search_push_button.setHidden(True) self.start_push_button.setHidden(True) n = len(iter_things) for ind, text in enumerate(iter_things): ext, _, _, qual, vora = quality.split(" ") vid = pt.YouTube(text, on_progress_callback=self.update_progress) if vora == "resolution": self.video_progress_bar.setHidden(False) self.message_label.setText( f"Downloading video.. ({ind + 1} of {n})") video_path, is_progressive = self.download_video( vid, ext, qual, target_dir) if not is_progressive: self.audio_progress_bar.setHidden(False) self.message_label.setText( f"Downloading audio.. ({ind + 1} of {n})") audio_path = self.download_audio(vid, "Highest", target_dir, ind, n) self.message_label.setText( f"Merging streams.. ({ind + 1} of {n})") v = VideoFileClip(video_path) a = AudioFileClip(audio_path) v = v.set_audio(a) self.message_label.setText( f"Writing to disk.. ({ind + 1} of {n})") v.write_videofile(f"{video_path[:-4]} - Output.mp4") v.close() a.close() os.remove(audio_path) os.remove(video_path) os.rename(f"{video_path[:-4]} - Output.mp4", f"{video_path[:-4]}.mp4") self.audio_progress_bar.setHidden(True) self.video_progress_bar.setHidden(True) elif vora == "bitrate": self.audio_progress_bar.setHidden(False) self.message_label.setText( f"Downloading audio stream.. ({ind + 1} of {n})") self.download_audio(vid, qual, target_dir, ind, n) self.audio_progress_bar.setHidden(True) self.title_label.setText("YouTube Downloader") self.message_label.setText("") self.message_label.setHidden(True) self.queue_push_button.setHidden(False) self.url_line_edit.setHidden(False) self.search_push_button.setHidden(False)