Skip to content

Instantly share code, notes, and snippets.

@costa
Last active May 24, 2023 09:39
Show Gist options
  • Save costa/de3af8c4e2e268c97812e5b5d9c83563 to your computer and use it in GitHub Desktop.
Save costa/de3af8c4e2e268c97812e5b5d9c83563 to your computer and use it in GitHub Desktop.
A FFmpRb script for the DEMO of the solo screen-based-presentation format
|o|
# NOTE Run me like this: | <ffmprb> <OUT-PATH>
# NOTE A bit of a boilerplate for more independence:
# NOTE for further processing:
video_output_options = {resolution: Ffmprb::HD_4K, fps: 60, encoder: 'huffyuv'}
Ffmprb::Process.input_video_auto_rotate = true # NOTE surprisingly, for the sake of oiPad media...'
class FfmprbUnzipper
def initialize
@tmp_files = []
@tmp_threads = []
at_exit do
@tmp_threads.each &:join rescue warn "WARN #{$!}"
@tmp_files.each &:unlink
end
end
def concat_to_fifo(zip_path, video: :landscape)
video_opt = video &&
{resolution: Ffmprb::HD_4K, fps: 60, encoder: 'huffyuv'}.tap do |opt|
w, h = opt[:resolution].split('x')
opt[:resolution] = "#{h}x#{w}" if
video == :portrait
end
Ffmprb::File.temp_fifo("-#{File.basename zip_path}.#{video ? 'avi' : 'wav'}").tap do |concat_tmp|
@tmp_files << concat_tmp
@tmp_threads << (
Ffmprb::Util::Thread.new do
Dir.mktmpdir do |tmp_dir|
Ffmprb.process do
output concat_tmp, video: video_opt do
Dir.chdir tmp_dir do
`unzip '#{zip_path}'`.lines.sort.map { |l| $1 if l =~ /extracting:\s*\b(.*\.m\w*)\b/i }.compact
end.map{ |c| File.expand_path c, tmp_dir }.each do |path|
roll input path, video: video
end
end
end
end
end
)
end
end
end
fuzr = FfmprbUnzipper.new
# NOTE the boilerplate ends here, change at will below:
inp_log =
input('/media/2023/05/05/media_ 2023_05_05 log_ 2023_04_30_stackshare-2y-old-listing-review.pub.logo+title - Page 1.png', loop: true)
inp_tit =
input('/media/2023/05/05/media_ 2023_05_05 log_ 2023_04_30_stackshare-2y-old-listing-review.pub.logo+title - Page 3.png', loop: true)
inp_mus =
input('/media/flemmingdalum.bandcamp.com/Salta & Roma mix by Flemming Dalum.mp3')
.volume(0.1)
inv = [
input('/media/2023/04/30/Screen Recording 2023-04-30 at 18.48.17.mov', audio: false),
input('/media/2023/04/30/IMG_0756.MOV', audio: false),
input(fuzr.concat_to_fifo('/media/2023/04/30/GX010304.zip'), audio: false),
input('/media/2023/04/30/Movie Recording 2023-04-30 at 18.48.17.mov', audio: false)
]
ina = [
# input('/media/2023/04/30/Screen Recording 2023-04-30 at 18.48.17.mov', video: false),
# TODO is this the best voice sound?
nil, # NOTE see the mechanism at the bottom
# input('/media/2023/04/30/IMG_0756.MOV', video: false),
nil,
input(fuzr.concat_to_fifo('/media/2023/04/30/GX010304.zip', video: false)),
# input('/media/2023/04/30/Movie Recording 2023-04-30 at 18.48.17.mov', video: false)
]
int = [ 6.35, 10.95, 9.45, 4.33]
output o, video: video_output_options do # 22:09 =1270
a_cuts = [] # NOTE for better sound, hopefully
def a_cuts.inp_cut_int(inv, int, i, from, to) # NOTE! receives times of first [0] input
if last && from == last[1]
last[1] += to - from
else
self << [from, to, (@last_time ||= 0)]
end
@last_time += to - from
inv[i].cut from: int[i] + from - int[0], to: int[i] + to - int[0]
end
# 1
lay a_cuts.inp_cut_int(inv, int, 1, 53.20, 65.20)
lay a_cuts.inp_cut_int inv, int, 0, 65.20, 72.15
lay a_cuts.inp_cut_int inv, int, 2, 72.15, 75.80
lay a_cuts.inp_cut_int inv, int, 0, 75.80, 79.30
lay a_cuts.inp_cut_int inv, int, 1, 79.30, 103.55
lay a_cuts.inp_cut_int inv, int, 0, 103.55, 121.70
#
lay a_cuts.inp_cut_int inv, int, 0, 127.00, 147.50
lay a_cuts.inp_cut_int inv, int, 1, 147.50, 153.40
lay a_cuts.inp_cut_int inv, int, 2, 153.40, 155.25
lay a_cuts.inp_cut_int inv, int, 0, 155.25, 163.70
lay a_cuts.inp_cut_int inv, int, 1, 163.70, 168.00
# Devbook... - a failed projet
lay a_cuts.inp_cut_int inv, int, 0, 168.00, 181.40
lay a_cuts.inp_cut_int inv, int, 1, 181.40, 185.90
lay a_cuts.inp_cut_int inv, int, 3, 185.90, 187.80
lay a_cuts.inp_cut_int inv, int, 1, 187.80, 190.70
lay a_cuts.inp_cut_int inv, int, 0, 190.70, 206.10
lay a_cuts.inp_cut_int inv, int, 1, 206.10, 211.75
lay a_cuts.inp_cut_int inv, int, 0, 211.75, 238.60
# 1
lay a_cuts.inp_cut_int inv, int, 1, 238.60, 252.00
lay a_cuts.inp_cut_int inv, int, 0, 252.00, 260.30
lay a_cuts.inp_cut_int inv, int, 2, 260.30, 263.50
lay a_cuts.inp_cut_int inv, int, 1, 263.50, 268.75
lay a_cuts.inp_cut_int inv, int, 2, 268.75, 272.05
lay a_cuts.inp_cut_int inv, int, 0, 272.05, 277.15
lay a_cuts.inp_cut_int inv, int, 3, 277.15, 280.75
lay a_cuts.inp_cut_int inv, int, 2, 280.75, 281.75
lay a_cuts.inp_cut_int inv, int, 1, 281.75, 283.35
lay a_cuts.inp_cut_int inv, int, 0, 283.35, 292.20
lay a_cuts.inp_cut_int inv, int, 3, 292.20, 293.75
lay a_cuts.inp_cut_int inv, int, 0, 293.75, 303.95
lay a_cuts.inp_cut_int inv, int, 1, 303.95, 314.10
# MMOCR... - a fair project
lay a_cuts.inp_cut_int inv, int, 0, 314.10, 319.75
lay a_cuts.inp_cut_int inv, int, 2, 319.75, 323.40
lay a_cuts.inp_cut_int inv, int, 0, 323.40, 330.70
lay a_cuts.inp_cut_int inv, int, 1, 330.70, 333.30
lay a_cuts.inp_cut_int inv, int, 0, 333.30, 340.65
lay a_cuts.inp_cut_int inv, int, 3, 340.65, 342.65
lay a_cuts.inp_cut_int inv, int, 1, 342.65, 348.20
lay a_cuts.inp_cut_int inv, int, 0, 348.20, 357.70
lay a_cuts.inp_cut_int inv, int, 2, 357.70, 359.40
lay a_cuts.inp_cut_int inv, int, 0, 359.40, 367.15
lay a_cuts.inp_cut_int inv, int, 2, 367.15, 368.70
lay a_cuts.inp_cut_int inv, int, 0, 368.70, 384.20
lay a_cuts.inp_cut_int inv, int, 1, 384.20, 386.75
lay a_cuts.inp_cut_int inv, int, 0, 386.75, 391.80
lay a_cuts.inp_cut_int inv, int, 1, 391.80, 393.30
lay a_cuts.inp_cut_int inv, int, 0, 393.30, 405.35
lay a_cuts.inp_cut_int inv, int, 3, 405.35, 408.55
lay a_cuts.inp_cut_int inv, int, 1, 408.55, 410.70
lay a_cuts.inp_cut_int inv, int, 0, 410.70, 421.75
lay a_cuts.inp_cut_int inv, int, 1, 421.75, 435.00
# cusdis... - privacy wat
lay a_cuts.inp_cut_int inv, int, 0, 435.40, 481.75
lay a_cuts.inp_cut_int inv, int, 1, 481.75, 486.75
lay a_cuts.inp_cut_int inv, int, 0, 486.75, 489.35
lay a_cuts.inp_cut_int inv, int, 1, 489.35, 493.85
lay a_cuts.inp_cut_int inv, int, 0, 493.85, 532.65
lay a_cuts.inp_cut_int inv, int, 3, 532.65, 538.30
lay a_cuts.inp_cut_int inv, int, 1, 538.30, 540.50
lay a_cuts.inp_cut_int inv, int, 2, 540.50, 544.65
lay a_cuts.inp_cut_int inv, int, 0, 544.65, 555.05
lay a_cuts.inp_cut_int inv, int, 1, 555.05, 565.05
# Material Tailwind... - flies kinda still
lay a_cuts.inp_cut_int inv, int, 1, 565.05, 569.10
lay a_cuts.inp_cut_int inv, int, 0, 569.10, 590.10
lay a_cuts.inp_cut_int inv, int, 0, 590.10, 600.10
# FigJam... - doesn't belong in stackshare
lay a_cuts.inp_cut_int inv, int, 0, 600.10, 618.15
lay a_cuts.inp_cut_int inv, int, 1, 618.15, 619.90
lay a_cuts.inp_cut_int inv, int, 0, 619.90, 625.45
lay a_cuts.inp_cut_int inv, int, 3, 625.45, 626.25
lay a_cuts.inp_cut_int inv, int, 1, 626.25, 629.65
# Pretrained AI... -- AI shop trying to monetise internal tools
lay a_cuts.inp_cut_int inv, int, 0, 629.65, 661.35
lay a_cuts.inp_cut_int inv, int, 1, 661.35, 664.95
lay a_cuts.inp_cut_int inv, int, 0, 664.95, 671.65
lay a_cuts.inp_cut_int inv, int, 1, 671.65, 677.10
lay a_cuts.inp_cut_int inv, int, 0, 677.10, 689.50
lay a_cuts.inp_cut_int inv, int, 1, 689.50, 701.90
lay a_cuts.inp_cut_int inv, int, 0, 701.90, 710.65
lay a_cuts.inp_cut_int inv, int, 1, 710.65, 713.10
lay a_cuts.inp_cut_int inv, int, 0, 713.10, 720.80
lay a_cuts.inp_cut_int inv, int, 3, 720.80, 722.75
lay a_cuts.inp_cut_int inv, int, 0, 722.75, 773.50
lay a_cuts.inp_cut_int inv, int, 1, 773.50, 780.45
# PolyGit... -- useless IDE thingy
lay a_cuts.inp_cut_int inv, int, 0, 780.45, 810.30
lay a_cuts.inp_cut_int inv, int, 2, 810.30, 813.95
lay a_cuts.inp_cut_int inv, int, 0, 813.95, 821.25
lay a_cuts.inp_cut_int inv, int, 1, 821.25, 824.80
lay a_cuts.inp_cut_int inv, int, 0, 824.80, 848.00
lay a_cuts.inp_cut_int inv, int, 1, 848.00, 858.00
# Clerk... -- reinventing user auth
lay a_cuts.inp_cut_int inv, int, 0, 858.00, 889.65
lay a_cuts.inp_cut_int inv, int, 3, 889.65, 892.05
lay a_cuts.inp_cut_int inv, int, 2, 892.05, 894.55
lay a_cuts.inp_cut_int inv, int, 1, 894.55, 899.85
lay a_cuts.inp_cut_int inv, int, 0, 899.85, 915.40
lay a_cuts.inp_cut_int inv, int, 1, 915.40, 919.60
lay a_cuts.inp_cut_int inv, int, 0, 919.60, 923.75
lay a_cuts.inp_cut_int inv, int, 1, 923.75, 930.85
lay a_cuts.inp_cut_int inv, int, 0, 930.85, 943.80
lay a_cuts.inp_cut_int inv, int, 1, 943.80, 945.05
lay a_cuts.inp_cut_int inv, int, 0, 945.05, 974.10
lay a_cuts.inp_cut_int inv, int, 1, 974.10, 976.15
lay a_cuts.inp_cut_int inv, int, 0, 976.15, 989.60
lay a_cuts.inp_cut_int inv, int, 3, 989.60, 990.40
lay a_cuts.inp_cut_int inv, int, 2, 990.40, 993.05
lay a_cuts.inp_cut_int inv, int, 1, 993.05, 994.10
lay a_cuts.inp_cut_int inv, int, 0, 994.10, 1004.35
lay a_cuts.inp_cut_int inv, int, 2, 1004.35, 1007.85
lay a_cuts.inp_cut_int inv, int, 3, 1007.85, 1008.65
lay a_cuts.inp_cut_int inv, int, 1, 1008.65, 1013.20
lay a_cuts.inp_cut_int inv, int, 0, 1013.20, 1020.95
lay a_cuts.inp_cut_int inv, int, 1, 1020.95, 1025.90
# Xitoring... - a devops tools monetisation attempt
lay a_cuts.inp_cut_int inv, int, 0, 1025.90, 1034.60
lay a_cuts.inp_cut_int inv, int, 1, 1034.60, 1044.85
lay a_cuts.inp_cut_int inv, int, 0, 1044.85, 1064.95
lay a_cuts.inp_cut_int inv, int, 1, 1064.95, 1068.45
lay a_cuts.inp_cut_int inv, int, 0, 1068.45, 1087.20
lay a_cuts.inp_cut_int inv, int, 2, 1087.20, 1089.40
lay a_cuts.inp_cut_int inv, int, 1, 1089.40, 1090.80
lay a_cuts.inp_cut_int inv, int, 0, 1090.80, 1098.90
lay a_cuts.inp_cut_int inv, int, 2, 1098.90, 1099.60
lay a_cuts.inp_cut_int inv, int, 3, 1099.60, 1101.65
lay a_cuts.inp_cut_int inv, int, 1, 1101.65, 1104.85
lay a_cuts.inp_cut_int inv, int, 0, 1104.85, 1111.55
lay a_cuts.inp_cut_int inv, int, 2, 1111.55, 1114.20
lay a_cuts.inp_cut_int inv, int, 1, 1114.20, 1116.40
lay a_cuts.inp_cut_int inv, int, 0, 1116.40, 1127.40
lay a_cuts.inp_cut_int inv, int, 1, 1127.40, 1131.55
lay a_cuts.inp_cut_int inv, int, 0, 1131.55, 1155.20
lay a_cuts.inp_cut_int inv, int, 1, 1155.20, 1162.20
# Metal3... - a living niche project
lay a_cuts.inp_cut_int inv, int, 0, 1162.20, 1176.90
lay a_cuts.inp_cut_int inv, int, 2, 1176.90, 1180.00
lay a_cuts.inp_cut_int inv, int, 1, 1180.00, 1182.25
lay a_cuts.inp_cut_int inv, int, 0, 1182.25, 1190.10
lay a_cuts.inp_cut_int inv, int, 1, 1190.10, 1197.95
lay a_cuts.inp_cut_int inv, int, 0, 1197.95, 1227.35
lay a_cuts.inp_cut_int inv, int, 1, 1227.35, 1230.00
lay a_cuts.inp_cut_int inv, int, 0, 1230.00, 1265.25
lay a_cuts.inp_cut_int inv, int, 3, 1265.25, 1267.50
lay a_cuts.inp_cut_int inv, int, 2, 1267.50, 1268.80
lay a_cuts.inp_cut_int inv, int, 0, 1268.80, 1289.35
lay a_cuts.inp_cut_int inv, int, 2, 1289.35, 1290.20
lay a_cuts.inp_cut_int inv, int, 0, 1290.20, 1301.85
lay a_cuts.inp_cut_int inv, int, 1, 1301.85, 1306.20
# Conclusion
lay a_cuts.inp_cut_int inv, int, 2, 1306.20, 1328.20
lay a_cuts.inp_cut_int inv, int, 1, 1328.20, 1335.80
a_cuts.each do |from, to, at| # TODO? yeah, this mechanism is kinda messy
ina.each_with_index do |ia, i|
overlay ia.cut(from: int[i] + from - int[0], to: int[i] + to - int[0]), at: at if
ia
end if # NOTE special from=nil entries
from
end
overlay inp_tit.cut(to: 6), at: 6
overlay inp_log.cut(to: 1170), at: 50
overlay inp_mus.cut(to: 1170), at: 50
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment