#!/usr/bin/env ruby # encoding: utf-8 require File.expand_path '../helper.rb', $0 doc = <<-DOC.gsub '__FILE__', File.basename($0) Glitch with Huffyuv codec. Usage: __FILE__ [-s -d -h -r ] -o [--debug] __FILE__ -h | --help Options: -o Set output file name. -d Set video duration by seconds. It is preferred to be less than 60s. [default: 30]. -r Set range in height of the glitch effect. It should be between 0 and 1. Or you can set increase-decrease value like "0.1-0.9" [default: 0.99]. -s Set start position of the video by seconds. --debug Flag for debugging [default: false]. -h --help Show this screen. DOC begin options = Docopt::docopt doc mktmpdir(options['--debug']) do |tmpdir| other_options = '' other_options += ' -t ' + options['-d'] other_options += ' -ss ' + options['-s'] if options['-s'] cmd = Cocaine::CommandLine.new 'ffmpeg', '-i :infile %s -c:v huffyuv -pix_fmt yuv422p -y -q:v 0 -an :outfile' % other_options huffyuvfile = tmpdir.join('huffyuv.avi') cmd.run infile: options[''], outfile: huffyuvfile.to_s a = AviGlitch.open huffyuvfile l = a.frames.size.to_f pos = options['-r'].split '-' pos[1] = pos[0] if pos[1].nil? sp, ep = pos.collect {|p| p.to_f } a.glitch_with_index do |f, i| p = i / l ratio = (ep - sp) * p + sp f[0, (1 - ratio) * f.size] end glitchfile = tmpdir.join 'glitch.avi' a.output glitchfile cmd = Cocaine::CommandLine.new 'avconv', '-i :infile -an -q:v 0 -c:v mpeg4 :outfile' cmd.run infile: glitchfile.to_s, outfile: options['-o'] end rescue Docopt::Exit => e puts e.message end