lib/carrierwave/video/ffmpeg_options.rb in carrierwave-video-0.2.3 vs lib/carrierwave/video/ffmpeg_options.rb in carrierwave-video-0.3.0
- old
+ new
@@ -1,25 +1,19 @@
module CarrierWave
module Video
class FfmpegOptions
- attr_reader :watermark_path, :watermark_position, :watermark_pixels,
- :format, :resolution, :custom, :callbacks
+ attr_reader :format, :resolution, :custom, :callbacks
def initialize(format, options)
@format = format.to_s
- @watermark = options[:watermark].present?
@resolution = options[:resolution] || "640x360"
@custom = options[:custom]
@callbacks = options[:callbacks] || {}
@logger = options[:logger]
@unparsed = options
- if watermark?
- @watermark_path = options[:watermark][:path]
- @watermark_position = options[:watermark][:position].to_s || :bottom_right
- @watermark_pixels = options[:watermark][:pixels_from_edge] || 10
- end
+ @format_options = defaults.merge(options)
end
def raw
@unparsed
end
@@ -27,61 +21,69 @@
def logger(model)
model.send(@logger) if @logger.present?
end
def encoder_options
- {preserve_aspect_ratio: :width}
+ { preserve_aspect_ratio: :width }
end
+ # input
def format_options
- @format_options ||= begin
- result = case format
- when "mp4"
- {
- video_codec: 'libx264',
- audio_codec: 'libfaac',
- custom: "-qscale 0 -vpre slow -vpre baseline -g 30 #{watermark_params}"
- }
- when "webm"
- {
- video_codec: 'libvpx',
- audio_codec: 'libvorbis',
- custom: "-b 1500k -ab 160000 -f webm -g 30 #{watermark_params}"
- }
- when "ogv"
- {
- video_codec: 'libtheora',
- audio_codec: 'libvorbis',
- custom: "-b 1500k -ab 160000 -g 30 #{watermark_params}"
- }
- else
- {}
- end
+ @format_options
+ end
- { resolution: resolution }.merge(result).tap do |h|
- h[:custom] = "#{custom} #{watermark_params}".strip if custom.present?
- end
- end
+ # output
+ def format_params
+ params = @format_options.dup
+ params[:custom] = [params[:custom], watermark_params].compact.join(' ')
+ params
end
def watermark?
- @watermark
+ @format_options[:watermark].present?
end
def watermark_params
- return "" unless watermark?
- positioning = case watermark_position
- when 'bottom_left'
- "#{watermark_pixels}:main_h-overlay_h-#{watermark_pixels}"
- when 'bottom_right'
- "main_w-overlay_w-#{watermark_pixels}:main_h-overlay_h-#{watermark_pixels}"
- when 'top_left'
- "#{watermark_pixels}:#{watermark_pixels}"
- when 'top_right'
- "main_w-overlay_w-#{watermark_pixels}:#{watermark_pixels}"
- end
+ return nil unless watermark?
- "-vf \"movie=#{watermark_path} [logo]; [in][logo] overlay=#{positioning} [out]\""
+ @watermark_params ||= begin
+ path = @format_options[:watermark][:path]
+ position = @format_options[:watermark][:position].to_s || :bottom_right
+ margin = @format_options[:watermark][:pixels_from_edge] || @format_options[:watermark][:margin] || 10
+ positioning = case position
+ when 'bottom_left'
+ "#{margin}:main_h-overlay_h-#{margin}"
+ when 'bottom_right'
+ "main_w-overlay_w-#{margin}:main_h-overlay_h-#{margin}"
+ when 'top_left'
+ "#{margin}:#{margin}"
+ when 'top_right'
+ "main_w-overlay_w-#{margin}:#{margin}"
+ end
+
+ "-vf \"movie=#{path} [logo]; [in][logo] overlay=#{positioning} [out]\""
+ end
end
+
+ private
+
+ def defaults
+ @defaults ||= { resolution: '640x360', watermark: {} }.tap do |h|
+ case format
+ when 'mp4'
+ h[:video_codec] = 'libx264'
+ h[:audio_codec] = 'libfaac'
+ h[:custom] = '-qscale 0 -vpre slow -vpre baseline -g 30'
+ when 'ogv'
+ h[:video_codec] = 'libtheora'
+ h[:audio_codec] = 'libvorbis'
+ h[:custom] = '-b 1500k -ab 160000 -g 30'
+ when 'webm'
+ h[:video_codec] = 'libvpx'
+ h[:audio_codec] = 'libvorbis'
+ h[:custom] = '-b 1500k -ab 160000 -f webm -g 30'
+ end
+ end
+ end
end
end
end