Jsem autorem tohoto programu, který generuje zpomalené videa do složky Output, do jednotlivých adresářů. Unikátnost spočívá v tom, že je ve výsledném videu jsou zachovány tóny ve zvuku. V každém adresáři budou soubory podle faktoru zpomalení. Klíčové pro mě bylo vytvořit ramdisk. Díky tomu se dočasné soubory nekopírují na fyzický disk. Program lze spustit na linuxu, testováno na python3.
Licence je nekomerční - za poplatek 200 Kč si můžete program zkopírovat do svého PC za účelem zřízení kopie pouze pro vás své použití. Psal jsem to 6 hodin. V případě zájmu o zaplacení licenčního poplatku mi napište komentář a pošlu vám číslo svého účtu.
# Autor: Radek Šimánek, 28.7.2024
# REQUIRES: moviepy a pydub
# librosa měla problém s kompatibilitou, takže jsem použil pydub
import os
from moviepy.editor import VideoFileClip, vfx, AudioFileClip
from pydub import AudioSegment
ramdisk_size = 50 # unit MB
# Cesty ke složkám
home_dir = os.path.expanduser("~")
default_path = "Videa/Kytarové rytmy - strumming patterns"
input_dir = os.path.join(home_dir, default_path)
os.system('clear')
print("Zadejte heslo sudo, pro vytvoření ramdisku.")
os.system('sudo echo " "')
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('.')
# Faktory zpomalení
slowdowns = [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)
# 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)
# Vytvoření RAM disku
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)
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")
# Zpomalení videí a korekce tónufor video_file in os.listdir(input_dir):
video_path = os.path.join(input_dir, video_file)
if os.path.isfile(video_path) and video_file.endswith(".mp4"): # Upravte podle formátu vašich videí
for i, factor in enumerate(slowdowns):
output_path = os.path.join(output_dirs[i], video_file)
video_clip = VideoFileClip(video_path)
# Extrakce a úprava audio stopy
temp_audio_path = os.path.join(ramdisk_path, "temp_audio.wav")
video_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
# Musí se dočasně uložit do souboru:
edited_clip = video_clip.set_audio(new_audio_clip)
temp_video_name = 'temp-final-video.m4a'
edited_clip.write_videofile(
os.path.join(ramdisk_path, 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'
)
video_clip.close()
new_audio_clip.close()
edited_clip = VideoFileClip(os.path.join(ramdisk_path, temp_video_name))
edited_clip = edited_clip.fx(vfx.speedx, 1.0 / factor)
edited_clip.set_duration(edited_clip.duration)
a = edited_clip.audio.duration
v = edited_clip.duration
print(f"Processing {video_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'
)
edited_clip.close() # Odstranění dočasných souborů z ramdisku
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(os.path.join(ramdisk_path, temp_video_name)):
os.remove(os.path.join(ramdisk_path, temp_video_name))
print("Job done.")
print("sudo unmount ramdisk")
os.system(f'sudo umount "{ramdisk_path}"')
Žádné komentáře:
Okomentovat