-
-
Save tommy-mor/d362754bf91a95ab59658cbc8da5a39f to your computer and use it in GitHub Desktop.
from moviepy.editor import * | |
import numpy as np | |
clip = VideoFileClip("hams.mkv") | |
import sounddevice as sd | |
import soundfile as sf | |
from queue import Queue | |
from collections import OrderedDict | |
import pprint | |
pp = pprint.PrettyPrinter(indent=4) | |
print('started') | |
print('sarted') | |
def freq(x): | |
b = x.mean(1) | |
d = (np.fft.rfft(b)**2) | |
w = d[1:].argmax() + 1 | |
return w | |
normal_audioarr = [ clip.audio.get_frame(t/clip.audio.fps) for t in range(0,int(clip.duration*clip.audio.fps))] | |
#normal_audioarr = [ clip.audio.get_frame(t/clip.audio.fps) for t in range(0,int(5*clip.audio.fps))] | |
video_clips = [clip.get_frame(t/clip.fps) for t in range(0,int(clip.fps*clip.duration))] | |
chunked = enumerate(np.array_split(np.array(normal_audioarr), int(clip.duration) * 15)) | |
chunked_vid = dict(enumerate(np.array_split(video_clips, int(clip.duration) * 15))) | |
#weird_audio = sorted(chunked, key=lambda x: abs(x[1]).sum()) | |
weird_audio = sorted(chunked, key=lambda x: freq(x[1])) | |
weird_audio_dict = OrderedDict(weird_audio) | |
weird_vid = [chunked_vid[i] for i in weird_audio_dict.keys()] | |
print('concating audio') | |
data = list(map(lambda x: x[1], weird_audio)) | |
l = np.array(data[0]) | |
for i in range(1,len(data)): | |
l = np.append(l, data[i], 0) | |
print(l.shape) | |
print(len(l)) | |
data = l | |
#data = normal_audioarr | |
#aclip = AudioClip(make_frame=make_frame, duration=clip.duration) | |
#aclip. | |
fs = 44100 | |
print("playing") | |
# NOTE, we will probably have to do it like 4 frames at a time so that it sounds like not static | |
sf.write('myfile.wav', data, fs) | |
print('concating video') | |
l = np.array(weird_vid[0]) | |
for i in range(1,len(weird_vid)): | |
l = np.append(l, weird_vid[i], 0) | |
print(l.shape) | |
global it | |
it = 0 | |
def make_frame(t): | |
global it | |
it += 1 | |
if it >= 4846: | |
return l[5] | |
return l[it] | |
vid = VideoClip(make_frame, duration = clip.duration) | |
audio = AudioFileClip('myfile.wav') | |
vid.set_audio(audio) | |
vid.write_videofile('out.mp4',clip.fps) | |
print('done') | |
#b has the suond data assoc with its frame | |
# sort b, then give each of b its frame using get_frame maybe? | |
#then make an audio clip using audioarrayclip which doesent exist yet | |
#then profit | |
#audioclip.preview() | |
video of this script's output: https://youtu.be/iWFRKZek0FI
this is so good 😍
This is so ugly and beautiful at the same time.
This is art.
This is such legendary shitposting code
11 print('sarted')
lmao
clip = VideoFileClip("hams.mkv")
Oh ghawd when I watched the video, I guessed when it was built, each frame was exported as a bitmap then reassembled as a video after processing.
when I saw this, all hope was lost
this must have taken 4 years to process
You should window the FFT, since FFT interprets the input block as being looped infinitely, and it'll interpret the looped signal as having a very sharp discontinuity at the wraparound point, which probably is making the result less accurate.
Also calling the FFT inside sort, whew boy (unless python is memoizing it), but maybe everything else is slow enough it doesn't matter that much.
68 lines of genius
this is the funneist thing I've ever read
@ScoreUnder thanks for kind words. I guess I was particularly bored that day.