first
commit
524bec2ddc
@ -0,0 +1,2 @@
|
||||
no_oob*
|
||||
lm_no_oob*
|
||||
@ -0,0 +1,107 @@
|
||||
=begin
|
||||
chop up two vods using splits as timestamps
|
||||
vertically stack each clip with the same name
|
||||
from each vod chopping
|
||||
|
||||
cut a video with ffmpeg:
|
||||
ffmpeg -i input.mp4 -ss <time> -t <duration> -c:v copy -c:a copy output.mp4
|
||||
=end
|
||||
|
||||
require "json"
|
||||
|
||||
def chop(input1, time, dur, output="output.mkv")
|
||||
chop_cmd = "ffmpeg -y -threads 24 -i #{input1} -ss #{time} -to #{dur} -c:v copy -c:a copy #{output}.mkv"
|
||||
system(chop_cmd)
|
||||
end
|
||||
|
||||
#need to make different commands for nvidia and x264
|
||||
def vstack(input1, input2, output="output.mkv")
|
||||
vstack_cmd = "ffmpeg -y " \
|
||||
"-threads 24 " \
|
||||
"-init_hw_device vaapi=foo:/dev/dri/renderD128 " \
|
||||
"-hwaccel vaapi " \
|
||||
"-hwaccel_output_format vaapi " \
|
||||
"-hwaccel_device foo " \
|
||||
"-i #{input1} " \
|
||||
"-hwaccel vaapi " \
|
||||
"-hwaccel_output_format vaapi " \
|
||||
"-hwaccel_device foo " \
|
||||
"-i #{input2} " \
|
||||
"-filter_hw_device foo " \
|
||||
"-c:v h264_vaapi " \
|
||||
"-filter_complex ' " \
|
||||
"[0:v]format=nv12|vaapi,hwupload[a], " \
|
||||
"[1:v]format=nv12|vaapi,hwupload[b], " \
|
||||
"[0:a][1:a]amix[a], " \
|
||||
"[a][b]vstack_vaapi=inputs=2[out]' " \
|
||||
"-map [out] -map [a] " \
|
||||
"#{output}"
|
||||
|
||||
system(vstack_cmd)
|
||||
end
|
||||
|
||||
=begin
|
||||
chop up the video by timestamp
|
||||
=end
|
||||
def chop_video(path)
|
||||
entries = Dir["#{path}/*"]
|
||||
|
||||
split_file_path = entries.select {|e| e.end_with?(".json")}[0]
|
||||
video_file_path = entries.select {|e| e.end_with?(".mkv")}[0]
|
||||
|
||||
split_file = File.open("#{Dir.pwd}/#{split_file_path}")
|
||||
data = JSON.load split_file
|
||||
|
||||
game_title = data['title']
|
||||
splits = data['splits']
|
||||
|
||||
time = "00:00:00"
|
||||
|
||||
`mkdir -p clips`
|
||||
|
||||
splits.each do |split|
|
||||
chop(video_file_path, time, split['time'], "clips/#{split['title'].split(" ").join("_").downcase}")
|
||||
time = split['time']
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
stack each video and save them to output/<name of video>
|
||||
=end
|
||||
def stack_video(p1, p2)
|
||||
e1 = Dir["#{p1}/clips/*"]
|
||||
`mkdir -p output`
|
||||
|
||||
e1.each {|e| print "#{e}\n"}
|
||||
|
||||
output = lambda { |e|
|
||||
o = e.split("#{p1}/clips/")[1]
|
||||
e2 = e.split("#{p1}")[1]
|
||||
vstack("#{p2}/#{e2}", e, "output/#{o}")
|
||||
}
|
||||
|
||||
e1.map(&output)
|
||||
end
|
||||
|
||||
=begin
|
||||
concatenate clips into final video
|
||||
=end
|
||||
def cat_video()
|
||||
entries = Dir["output/*"].map { |entry| "file #{entry}\n" }.join
|
||||
|
||||
File.open("list.txt", "w") do |file|
|
||||
file.write entries
|
||||
end
|
||||
|
||||
`ffmpeg -f concat -i list.txt -c copy output.mkv`
|
||||
end
|
||||
|
||||
def concatenate_video(p1, p2)
|
||||
chop_video(p1)
|
||||
chop_video(p2)
|
||||
stack_video(p1, p2)
|
||||
cat_video()
|
||||
end
|
||||
|
||||
concatenate_video(ARGV[0], ARGV[1])
|
||||
|
||||
Loading…
Reference in New Issue