Tento kod vychází ze skriptu pro zpomalení videa a zachování tónů
Původní kód je zde (autor Radek Šimánek)
Tento kód jsem otestoval a je funkční. Zpomalil jsem videa s extrémně rychlým finger-pickingem.
# REQUIRES: moviepy a pydub import os from moviepy.editor import VideoFileClip, concatenate_videoclips, vfx, AudioFileClip from pydub import AudioSegment # Cesty ke složkám home_dir = os.path.expanduser("~") default_path = "/Flamenco-finger-picking-rhythm" input_dir = os.path.join("/media/toshiba/home/user/Videa", default_path) file = 'Paola Hermosin a melodie od Aurelio Almonte 5 04 a 5 23-5 30.mp4' input_path = os.path.join(input_dir, file) ramdisk_disable = True # Deaktivuje vytvoření RAM disku user_choice = input("Chcete použít aktuální složku (.) nebo přednastavenou složku? Zadejte '.' pro aktuální složku nebo 'default' pro přednastavenou složku: ") if user_choice == '.': input_dir = os.path.abspath('.') input_path = os.path.join(input_dir, file) # Faktory zpomalení slowdowns = [2, 3, 4, 5, 6, 8, 10] # Vytvoření výstupních složek dynamicky na základě faktorů zpomalení output_dirs = [os.path.join(input_dir, f"Output/{factor}") for factor in slowdowns] for dir in output_dirs: os.makedirs(dir, exist_ok=True) # Vytvoření RAM disku (bez skutečného připojení, pokud je ramdisk_disable = True) ramdisk_path = os.path.join(input_dir, "ramdisk") log_file = os.path.join(input_dir, "ramdisk.log") if not os.path.exists(ramdisk_path): os.makedirs(ramdisk_path) if not ramdisk_disable: with open(log_file, "w") as log: os.system(f'sudo mount -t tmpfs -o size={ramdisk_size}M tmpfs "{ramdisk_path}"') os.system(f'df "{ramdisk_path}" > "{log_file}"') with open(log_file, "r") as log: log_content = log.read() if ramdisk_path in log_content: print(f"RAM disk is correctly mounted.") else: print(f"RAM disk is not found") # Funkce pro změnu pitch audia bez změny rychlosti def audio_pitchup_ffmpeg(input_audio_path, output_audio_path, factor): command = f'ffmpeg -i "{input_audio_path}" -filter_complex "rubberband=pitch={factor}" "{output_audio_path}"' os.system(command) # Převod času na sekundy def convert_to_seconds(time_str): parts = time_str.split(':') minutes = int(parts[0]) seconds = float(parts[1]) return minutes * 60 + seconds # Definice časových rozsahů k vyexportování time_ranges = [ ("5:04", "5:08.75"), ("5:11.75", "5:17.00"), ("5:23.40", "5:31.27") ] # Zpracování jednoho videa file video_path = input_path if os.path.isfile(video_path) and video_path.endswith(".mp4"): # Upravte podle formátu vašich videí video_clip = VideoFileClip(video_path) # Exportování specifikovaných časových úseků jako dočasné soubory temp_clips = [] for start_time, end_time in time_ranges: start_seconds = convert_to_seconds(start_time) end_seconds = convert_to_seconds(end_time) temp_clip = video_clip.subclip(start_seconds, end_seconds) temp_clips.append(temp_clip) # Sloučení úseků do jednoho videa temp_joined_path = os.path.join(input_dir, "temp_joined.avi") joined_clip = concatenate_videoclips(temp_clips) joined_clip.write_videofile(temp_joined_path, codec="libx264", audio_codec="aac") # Uzavření všech klipů for clip in temp_clips: clip.close() video_clip.close() joined_clip.close() # Zpomalení videí a korekce pitch v audio stopách for i, factor in enumerate(slowdowns): output_path = os.path.join(output_dirs[i], file) edited_clip = VideoFileClip(temp_joined_path) # Extrakce a úprava audio stopy temp_audio_path = os.path.join(ramdisk_path, "temp_audio.wav") edited_clip.audio.write_audiofile(temp_audio_path, codec='pcm_s16le') new_audio_path = os.path.join(ramdisk_path, "new_temp_audio.wav") audio_pitchup_ffmpeg(temp_audio_path, new_audio_path, factor) new_audio_clip = AudioFileClip(new_audio_path) # Vytvoření nového video klipu s upravenou audio stopou edited_clip = edited_clip.set_audio(new_audio_clip) temp_video_name = os.path.join(ramdisk_path, "temp-final-video.m4a") edited_clip.write_videofile( temp_video_name, codec="libx264", audio_codec="aac", temp_audiofile=os.path.join(ramdisk_path, 'temp-audio-1.m4a'), remove_temp=True, threads=4, preset='ultrafast' ) # Uzavření dočasných klipů edited_clip.close() new_audio_clip.close() # Znovu otevření video klipu pro zpomalení edited_clip = VideoFileClip(temp_video_name) edited_clip = edited_clip.fx(vfx.speedx, 1.0 / factor) edited_clip.set_duration(edited_clip.duration) print(f"Processing {file} with slowdown factor {factor}. Saving to {output_path}") edited_clip.write_videofile( output_path, codec="libx264", audio_codec="aac", temp_audiofile=os.path.join(ramdisk_path,'temp-audio-2.m4a'), remove_temp=True, threads=4, preset='ultrafast' ) # Uzavření všech klipů edited_clip.close() # Odstranění dočasných souborů if os.path.exists(temp_audio_path): os.remove(temp_audio_path) if os.path.exists(new_audio_path): os.remove(new_audio_path) if os.path.exists(temp_video_name): os.remove(temp_video_name) # Odstranění dočasného sloučeného videa if os.path.exists(temp_joined_path): os.remove(temp_joined_path) print("Job done.") if not ramdisk_disable: os.system(f'sudo umount "{ramdisk_path}"')
Nápověda
Změny a funkce skriptu:
Deaktivace RAM disku: Použil jsem proměnnou
ramdisk_disable
, která když je nastavena naTrue
, neprovádí operace související s RAM diskem.Vyexportování a spojení časových úseků: Skript nyní používá funkci
subclip()
zmoviepy
, aby vybral specifikované časové úseky z videa. Tyto úseky jsou následně spojeny pomocíconcatenate_videoclips()
, a vytvoří se dočasný sloučený soubortemp_joined.avi
.Zpomalení videa: Po vytvoření dočasného sloučeného souboru jsou použity zpomalovací faktory k vytvoření výsledných videí.
Uzavírání streamů: Každý otevřený klip (vstupní i dočasné) je správně uzavřen pomocí
close()
, aby se předešlo konfliktům při čtení a zápisu do souborů.
Žádné komentáře:
Okomentovat