~cytrogen/masto-fe

0f3f9b611f509fc5405bb1bcbeb71dfcdff7095b — Eugen Rochko 2 years ago 70cae19
Change video bitrate to always fit within size limit (#26970)

1 files changed, 8 insertions(+), 5 deletions(-)

M lib/paperclip/transcoder.rb
M lib/paperclip/transcoder.rb => lib/paperclip/transcoder.rb +8 -5
@@ 41,11 41,14 @@ module Paperclip
        @output_options['vframes'] = 1
      when 'mp4'
        unless eligible_to_passthrough?(metadata)
          bitrate = (metadata.width * metadata.height * 30 * BITS_PER_PIXEL) / 1_000

          @output_options['b:v']     = "#{bitrate}k"
          @output_options['maxrate'] = "#{bitrate + 192}k"
          @output_options['bufsize'] = "#{bitrate * 5}k"
          size_limit_in_bits = MediaAttachment::VIDEO_LIMIT * 8
          desired_bitrate = (metadata.width * metadata.height * 30 * BITS_PER_PIXEL).floor
          maximum_bitrate = (size_limit_in_bits / metadata.duration).floor - 192_000 # Leave some space for the audio stream
          bitrate = [desired_bitrate, maximum_bitrate].min

          @output_options['b:v']     = bitrate
          @output_options['maxrate'] = bitrate + 192_000
          @output_options['bufsize'] = bitrate * 5

          if high_vfr?(metadata)
            @output_options['vsync'] = 'vfr'