Created
August 13, 2023 13:16
-
-
Save costa/80d28c2d747840cc3f5eccdfc6cf357e to your computer and use it in GitHub Desktop.
SEE (actually, WATCH) https://www.youtube.com/watch?v=9SAUdx1FBis
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
|o| | |
video_output_options = {resolution: Ffmprb::HD_4K, fps: 60, encoder: 'huffyuv'} | |
class InputSlideCropper | |
def initialize(inp, cols = 1, rows = 1) | |
fail "not much of a slideshow" unless | |
rows > 0 && cols > 0 && rows + cols > 2 | |
@inp = inp | |
@h1 = 1.0/(@rows = rows) | |
@w1 = 1.0/(@cols = cols) | |
end | |
def slide(col = 1, row = 1) | |
fail "hey, I don't have that many (#{col}, #{row}) cols/rows, just #{@cols}, #{@rows}" unless | |
row <= @rows && col <= @cols | |
@inp.crop top: @h1 * (row - 1), bottom: @h1*(@rows - row), left: @w1 * (col - 1), right: @w1*(@cols - col) | |
end | |
end | |
inp_screen = | |
input('/media/2023/08/09/Screen Recording 2023-08-09 at 15.15.48.mov') | |
.mute | |
inp_ols = InputSlideCropper.new( | |
input('/media/2023/08/09/media_ 2023_08_09 proj_ ghlr_doc_presenting_git-demo - Page 1.png', loop: true), | |
2, 6 | |
) | |
inp_vo = | |
input('/media/2023/08/12/Yehoshua Barzilay Street 2.m4a') | |
inp_bm = | |
input('/media/wwardlaw.com/MellowDub23.aif') | |
.volume(0.09) | |
output o, video: video_output_options do | |
overlays = [] | |
curr_time = 0 | |
define_singleton_method :paste do |from, to, pace=1, inp=inp_screen| | |
lay inp.cut(from: from, to: to).pace(pace) | |
curr_time += (to - from)/pace.to_f | |
end | |
overlays << [inp_ols.slide(1, 1), curr_time+1, 4] | |
paste 0, 8, 4 | |
paste 8, 24, 8 | |
paste 24, 56, 16 | |
overlays << [inp_ols.slide(1, 2), curr_time, 16] | |
paste 56, 44*60, 512 | |
paste 45*60+57, 46*60+7, 32 | |
paste 46*60+42, 46*60+54, 32 | |
paste 47*60+11, 53*60+4, 64 | |
paste 73*60, 73*60+23, 8 | |
overlays << [inp_ols.slide(1, 3), curr_time+4, 8] | |
paste 73*60+23, 74*60+34, 2 | |
paste 75*60+20, 76*60+7, 2 | |
paste 76*60+26, 76*60+37, 2 | |
paste 77*60+31, 77*60+32, 2 | |
paste 78*60+45, 78*60+53, 1 | |
paste 79*60+18, 79*60+26, 2 | |
paste 79*60+41, 80*60+17, 1 | |
paste 80*60+17, 80*60+31, 4 | |
overlays << [inp_ols.slide(1, 4), curr_time, 8] | |
paste 80*60+41, 81*60+10, 2 | |
paste 81*60+10, 81*60+17, 1 | |
paste 81*60+30, 81*60+36, 1 | |
overlays << [inp_ols.slide(1, 5), curr_time, 16] | |
paste 81*60+42, 82*60+10, 1 | |
paste 82*60+10, 82*60+12, 2 | |
paste 82*60+12, 82*60+16, 4 | |
paste 82*60+16, 82*60+24, 8 | |
paste 82*60+24, 82*60+40, 16 | |
paste 82*60+40, 127*60, 512 | |
paste 127*60, 127*60+8, 16 | |
paste 127*60+8, 127*60+12, 4 | |
paste 127*60+12, 127*60+14, 1 | |
paste 132*60+12, 132*60+24, 2 | |
overlays << [inp_ols.slide(1, 6), curr_time, 16] | |
paste 132*60+43, 132*60+57, 1 | |
paste 133*60+24, 133*60+40, 1 | |
overlays << [inp_ols.slide(2, 2), curr_time+1, 16] | |
paste 139*60+50, 140*60+39, 1 | |
overlays << [inp_ols.slide(2, 3), curr_time, 16] | |
paste 141*60+4, 141*60+34, 2 | |
paste 141*60+42, 142*60+7, 1 | |
paste 146*60+6, 146*60+28, 1 | |
paste 147*60+43, 148*60+2, 1 | |
overlays << [inp_ols.slide(2, 4), curr_time, 16] | |
paste 148*60+2, 148*60+46, 2 | |
paste 149*60+48, 149*60+52, 1 | |
paste 150*60+24, 151*60+15, 1 | |
overlays << [inp_ols.slide(2, 5), curr_time, 16] | |
paste 151*60+53, 152*60+23, 1 | |
paste 152*60+30, 152*60+40, 2 | |
paste 153*60+4, 153*60+12, 1 | |
paste 153*60+14, 153*60+19, 1 | |
paste 153*60+23, 153*60+33, 1 | |
overlays << [inp_ols.slide(2, 6), curr_time, 16] | |
paste 153*60+42, 154*60+21, 1 | |
paste 154*60+25, 154*60+38, 1 | |
# NOTE suppose the logo is at (2, 1), | |
# the overlays are sequential and at least couple of seconds apart | |
# and the logo comes up after the first overlay and disappears before the last | |
inp_logo = inp_ols.slide(2, 1) | |
before_at = 0 | |
overlays.each do |inp, at, len| | |
unless before_at == 0 || (at - before_at) < 4 | |
overlay inp_logo.cut(to: at - before_at - 2), at: before_at + 1 | |
end | |
overlay inp.cut(to: len), at: at | |
before_at = at + len | |
end | |
overlay inp_bm.cut(to: curr_time - 6*2), at: 6 | |
overlay inp_vo | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment