lib/wgif/video.rb
require 'streamio-ffmpeg'
require 'fileutils'
module WGif
class Video
attr_accessor :name, :clip, :logger
def initialize(name, filepath)
@name = name
@clip = FFMPEG::Movie.new(filepath)
FileUtils.mkdir_p '/tmp/wgif/'
@logger = Logger.new("/tmp/wgif/#{name}.log")
FFMPEG.logger = @logger
end
def trim(start_timestamp, duration)
options = {
custom: "-ss #{start_timestamp} -t 00:00:#{format('%06.3f', duration)}"
}
transcode(@clip, "/tmp/wgif/#{@name}-clip.mov", options)
WGif::Video.new "#{@name}-clip", "/tmp/wgif/#{@name}-clip.mov"
end
def to_frames(options = {})
make_frame_dir
if options[:frames]
framerate = options[:frames] / @clip.duration
else
framerate = 24
end
transcode(@clip, "/tmp/wgif/frames/\%5d.png", "-vf fps=#{framerate}")
open_frame_dir
end
private
def make_frame_dir
FileUtils.rm Dir.glob('/tmp/wgif/frames/*.png')
FileUtils.mkdir_p '/tmp/wgif/frames'
end
def open_frame_dir
Dir.glob('/tmp/wgif/frames/*.png').sort
end
def transcode(clip, file, options)
clip.transcode(file, options)
rescue FFMPEG::Error => error
unless error.message.include? 'no output file created'
raise WGif::ClipEncodingException
end
if error.message.include? 'Invalid data found when processing input'
raise WGif::ClipEncodingException
end
end
end
end