Skip to content

Instantly share code, notes, and snippets.

@costa
Created August 13, 2023 13:16
Show Gist options
  • Save costa/80d28c2d747840cc3f5eccdfc6cf357e to your computer and use it in GitHub Desktop.
Save costa/80d28c2d747840cc3f5eccdfc6cf357e to your computer and use it in GitHub Desktop.
|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