Instantly share code, notes, and snippets.
Last active
May 24, 2023 09:39
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
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
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| | |
# 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