#!/usr/bin/env ruby # Generate datamoshing require 'optparse' require 'rubygems' require 'aviglitch' output = './out.avi' all = false fake = false tmpdir = nil opts = OptionParser.new do |opts| opts.banner = "datamosh - AviGlitch's datamoshing video generator." opts.define_head "Usage: #{File.basename($0)} [options] file [file2 ...]" opts.separator "Options:" opts.on("-o", "--output [OUTPUT]", "Output the video to OUTPUT (./out.avi by default)") do |f| output = f end opts.on("-a", "--all", "Remove all keyframes (It remains a first keyframe by default)") do all = true end opts.on("--fake", "Remains all keyframes as full pixel included deltaframe") do fake = true if all warn "The --fake option cannot use with -a/--all option.\n" exit end end opts.on("--tmpdir [DIR]", "Specify the temporary directory") do |dir| tmpdir = dir end opts.on_tail("-h", "--help", "Show this message") do puts opts exit end opts.version = AviGlitch::VERSION end input = opts.parse! if input.empty? puts opts exit 1 else input.each do |file| if !File.exist?(file) || File.directory?(file) opts.banner = "#{file}: No such file.\n\n" puts opts exit 1 end end end a = AviGlitch.open input.shift, tmpdir: tmpdir unless fake a.glitch_with_index :keyframe do |frame, i| (!all && i == 0) ? frame : "" # keep the first frame end end if !all && !fake first = a.frames.index(a.frames.first_of(:keyframe)) a.mutate_keyframes_into_deltaframes! (first + 1)..a.frames.size else a.mutate_keyframes_into_deltaframes! end input.each do |file| b = AviGlitch.open file, tmpdir: tmpdir unless fake b.glitch :keyframe do |frame| "" end end b.mutate_keyframes_into_deltaframes! a.frames.concat b.frames end a.output output