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