Sha256: 587bd4fc3fb0789ceafd0e2a0560a5fb4ee8da4a7e6cd6fe4140d1a54b2097e8

Contents?: true

Size: 1.5 KB

Versions: 1

Compression:

Stored size: 1.5 KB

Contents

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 = {
        audio_codec: 'copy',
        video_codec: 'copy',
        custom: "-ss #{start_timestamp} -t 00:00:#{'%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/\%2d.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')
    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

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
wgif-0.3.0 lib/wgif/video.rb