diff options
| author | AppleDash <[email protected]> | 2020-08-07 19:27:33 -0400 |
|---|---|---|
| committer | AppleDash <[email protected]> | 2020-08-07 19:27:33 -0400 |
| commit | 07c9e6fcf2ae7b0e22c2333ebb3ffe6a5e3a1d3c (patch) | |
| tree | bec48d0f2665921e62d5fb17deacc439305ac1b6 /lib/booru/image_processing/mp4_processor.rb | |
| parent | 32a3f9346b8b39ab5b506019629fb416c86f2228 (diff) | |
Rewrite image processing engine pretty majorly
Diffstat (limited to 'lib/booru/image_processing/mp4_processor.rb')
| -rw-r--r-- | lib/booru/image_processing/mp4_processor.rb | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/booru/image_processing/mp4_processor.rb b/lib/booru/image_processing/mp4_processor.rb new file mode 100644 index 0000000..01fdf41 --- /dev/null +++ b/lib/booru/image_processing/mp4_processor.rb @@ -0,0 +1,53 @@ +require 'shellwords' +require 'svg_scrubber' + +module Booru + module ImageProcessing + class Mp4Processor < Processor + include ShellHelper + + def initialize(original_path, directory) + super(original_path, directory) + @rasterized = File.join(@directory, 'still.png') + end + + def pre_process + # generate still image + median_time = `ffprobe -i #{@original_path.shellescape} -show_entries format=duration -v quiet -of csv="p=0"`.to_f / 2 + `ffmpeg -loglevel quiet -n -i #{@original_path.shellescape} -ss #{median_time} -frames:v 1 #{@rasterized.shellescape}` + end + + def is_video? + true + end + + def generate_version(dimensions, destination_path) + width, height = dimensions + width &= 4_294_967_294 + height &= 4_294_967_294 + + # generate webm version + `ffmpeg -loglevel 0 -threads 0 -y -i #{@original_path.shellescape} -c:v libvpx -b:v 1M -crf 10 -speed 16 -vf "scale=w=#{width}:h=#{height}:force_original_aspect_ratio=decrease" #{destination_path.gsub(/mp4\z/, 'webm').shellescape}` + + # generate mp4 version + `ffmpeg -loglevel 0 -threads 0 -y -i #{@original_path.shellescape} -vf "scale=w=#{width}:h=#{height}:force_original_aspect_ratio=decrease, scale=trunc(iw/2)*2:trunc(ih/2)*2" -preset veryfast #{destination_path.shellescape}` + end + + def generate_full_version(destination_path) + webm_path = File.join(File.dirname(destination_path), 'full.webm') + FileUtils.ln_sf(@original_path, destination_path) + + # generate full.webm from full.mp4 + `ffmpeg -loglevel 0 -threads 0 -y -i #{@original_path} -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -preset veryfast #{webm_path}` + end + + def additional_process + # generate gifs from mp4s; no idea why this is special-cased. + duration = `ffprobe -loglevel quiet -of 'compact=nokey=1:print_section=0' -show_format_entry duration #{@original_path.shellescape}`.chomp.to_f / 10 + [[250, :thumb], [150, :thumb_small], [50, :thumb_tiny]].each do |w, n| + `ffmpeg -loglevel 0 -i #{@original_path.shellescape} -vf "fps=1/#{duration},scale=w=#{w}:h=#{w}:force_original_aspect_ratio=decrease" -vframes 10 -qscale:v 2 -f image2pipe -vcodec ppm - | convert -delay 50 -loop 0 - gif:- | gifsicle -O2 > #{@directory}/#{n}.gif` + end + end + end + end +end |
