Enables ActiveStorage variants for other file types than images, such as audio or video files, through an API for registering custom transformers similar to previewers.
This will provide for you to add ffmpeg
or other transformers to pre-process video, audio files.
Add this line to your application's Gemfile:
gem 'activestorage-autobots'
And then execute:
$ bundle
# lib/active_storage/transformers/ffmpeg_transformer.rb
require 'active_storage/transformers/transformer'
class ActiveStorage::Transformers::FFMPEGTransformer < ActiveStorage::Transformers::Transformer
def self.accept?(blob)
blob.video? || blob.audio?
end
def transform(input, format:)
format ||= File.extname(input.path)
options = transformations[:ffmpeg_opts]
create_tempfile(ext: format) do |output|
system "ffmpeg -y -i #{input.path} #{options} #{output.path}", exception: true
yield output
end
end
def create_tempfile(ext: '')
ext = ".#{ext}" unless ext.blank? || ext.start_with?('.')
tempfile = Tempfile.new(['active_storage_transformer_', ext], binmode: true)
yield tempfile
ensure
tempfile.close!
end
end
Update in initializers
# config/initializers/active_storage.rb
require 'active_storage/transformers/ffmpeg_transformer'
ActiveStorage.transformers << ActiveStorage::Transformers::FFMPEGTransformer
# => [ ActiveStorage::Transformers::ImageProcessingTransformer, FFMPEGTransformer ]
<%= audio_tag(
user.my_audio.variant(
ffmpeg_opts: "-af silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-90dB",
format: "mp3"
)
) %>
Bug reports and pull requests are welcome on GitHub at https://github.com/jetthoughts/activestorage-autobots. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.
The gem is available as open source under the terms of the MIT License.