1
0
Fork 1
forked from fedi/mastodon

Change video compression parameters (#26631)

This commit is contained in:
Eugen Rochko 2023-08-28 19:40:08 +02:00 committed by GitHub
parent dd72a8d28b
commit 01b87a1632
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 12 deletions

View file

@ -44,6 +44,7 @@ class MediaAttachment < ApplicationRecord
MAX_VIDEO_MATRIX_LIMIT = 8_294_400 # 3840x2160px MAX_VIDEO_MATRIX_LIMIT = 8_294_400 # 3840x2160px
MAX_VIDEO_FRAME_RATE = 120 MAX_VIDEO_FRAME_RATE = 120
MAX_VIDEO_FRAMES = 36_000 # Approx. 5 minutes at 120 fps
IMAGE_FILE_EXTENSIONS = %w(.jpg .jpeg .png .gif .webp .heic .heif .avif).freeze IMAGE_FILE_EXTENSIONS = %w(.jpg .jpeg .png .gif .webp .heic .heif .avif).freeze
VIDEO_FILE_EXTENSIONS = %w(.webm .mp4 .m4v .mov).freeze VIDEO_FILE_EXTENSIONS = %w(.webm .mp4 .m4v .mov).freeze
@ -98,17 +99,12 @@ class MediaAttachment < ApplicationRecord
convert_options: { convert_options: {
output: { output: {
'loglevel' => 'fatal', 'loglevel' => 'fatal',
'movflags' => 'faststart', 'preset' => 'veryfast',
'pix_fmt' => 'yuv420p',
'vf' => 'scale=\'trunc(iw/2)*2:trunc(ih/2)*2\'',
'vsync' => 'cfr',
'c:v' => 'h264', 'c:v' => 'h264',
'maxrate' => '1300K', 'c:a' => 'aac',
'bufsize' => '1300K', 'b:a' => '192k',
'b:v' => '1300K',
'frames:v' => 60 * 60 * 3,
'crf' => 18,
'map_metadata' => '-1', 'map_metadata' => '-1',
'frames:v' => MAX_VIDEO_FRAMES,
}.freeze, }.freeze,
}.freeze, }.freeze,
}.freeze }.freeze
@ -135,7 +131,7 @@ class MediaAttachment < ApplicationRecord
convert_options: { convert_options: {
output: { output: {
'loglevel' => 'fatal', 'loglevel' => 'fatal',
:vf => 'scale=\'min(400\, iw):min(400\, ih)\':force_original_aspect_ratio=decrease', :vf => 'scale=\'min(640\, iw):min(640\, ih)\':force_original_aspect_ratio=decrease',
}.freeze, }.freeze,
}.freeze, }.freeze,
format: 'png', format: 'png',

View file

@ -4,6 +4,9 @@ module Paperclip
# This transcoder is only to be used for the MediaAttachment model # This transcoder is only to be used for the MediaAttachment model
# to check when uploaded videos are actually gifv's # to check when uploaded videos are actually gifv's
class Transcoder < Paperclip::Processor class Transcoder < Paperclip::Processor
# This is the H.264 "High" value taken from https://www.dr-lex.be/info-stuff/videocalc.html
BITS_PER_PIXEL = 0.11
def initialize(file, options = {}, attachment = nil) def initialize(file, options = {}, attachment = nil)
super super
@ -38,8 +41,11 @@ module Paperclip
@output_options['vframes'] = 1 @output_options['vframes'] = 1
when 'mp4' when 'mp4'
unless eligible_to_passthrough?(metadata) unless eligible_to_passthrough?(metadata)
@output_options['acodec'] = 'aac' bitrate = (metadata.width * metadata.height * 30 * BITS_PER_PIXEL) / 1_000
@output_options['strict'] = 'experimental'
@output_options['b:v'] = "#{bitrate}k"
@output_options['maxrate'] = "#{bitrate + 192}k"
@output_options['bufsize'] = "#{bitrate * 5}k"
if high_vfr?(metadata) if high_vfr?(metadata)
@output_options['vsync'] = 'vfr' @output_options['vsync'] = 'vfr'