Upload và tạo video thumbnail với carrierwave
carrierwave là gem rất phổ biến trong framework rails sử dụng để upload các loại files. Gem này hỗ trợ rất nhiều chức năng và rất mạnh. Nếu bạn chưa biết đến gem này, hãy vào https://github.com/carrierwaveuploader/carrierwave để xem chi tiết cách sử dụng và tính năng của nó. Hôm này mình sẽ giới ...
carrierwave là gem rất phổ biến trong framework rails sử dụng để upload các loại files. Gem này hỗ trợ rất nhiều chức năng và rất mạnh. Nếu bạn chưa biết đến gem này, hãy vào https://github.com/carrierwaveuploader/carrierwave để xem chi tiết cách sử dụng và tính năng của nó.
Hôm này mình sẽ giới thiệu các bạn về cách tạo thumbnail luôn từ video đã upload, không cần phải mất thời gian để tìm ảnh cho video đó nữa. Trong bài này mình sẽ sử dụng gem carrierwave-video-thumbnailer kết hợp với gem carrierwave.
- Install gem carrierwave:
gem 'carrierwave', '~> 1.0' //hoặc $ gem install carrierwave
- Install gem carrierwave-video-thumbnailer:
gem 'carrierwave-video-thumbnailer' //hoặc $ gem install carrierwave-video-thumbnailer
- Gem carrierwave-video-thumbnailer sử dụng ffmpegthumbnailer để tạo thumbnail
// Ubuntu sudo apt-get install ffmpegthumbnailer // mac brew install ffmpegthumbnailer
- Tạo uploader cho video:
rails generate uploader Video
Nó sẽ sinh ra file uploader như sau:
// app/uploaders/video_uploader.rb
class VideoUploader < CarrierWave::Uploader::Base
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
end
- Bây giờ bạn đã có VideoUploader rồi, tiếp theo là bước kết hợp carrierwave-video-thumbnailer với VideoUploader đó:
// app/uploaders/video_uploader.rb
class VideoUploader < CarrierWave::Uploader::Base
include CarrierWave::Video // cho video proccessing
include CarrierWave::Video::Thumbnailer // để tạo video thumbnail
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
version :thumb do
process thumbnail: [{format: "png", quality: 10, size: 512, logger: Rails.logger}]
def full_filename for_file
png_name for_file, version_name
end
end
def png_name for_file, version_name
%Q{#{version_name}_video_#{model.id}.png}
end
end
Sau khi upload video, sẽ tạo version :thumb chính là thumbnail của video đã upload. Thumbnailer Options sẽ bao gồm:
- format: 'jpg' hoặc 'png' ('jpg' là mặc định).
- quality: chất lượng ảnh (1 to 10, mặc định là 8).
- size: kích thước thumbnail (pixel) (mặc định là 128).
- strip: movie film strip decoration (mặc định là false).
- seek: Đoạn nào cần snapshot. có thể HH:MM:SS hoặc X%. mặc định là 10%.
- square: Nếu true sẽ tạo thành square thumbnail.
- logger: Sử dụng để tạo log (Rails.logger)
VideoUploader đã hoàn thiện. Bây giờ mình gán uploader này cho trường nào đó mình cần lưu video url đó, ví du như sau:
// app/models/movie.rb class Movie < ActiveRecord::Base mount_uploader :video, VideoUploader end
Vào console để thử nhé:
$ movie = Movie.create! video: File.open("public/video.mp4")
$ movie.video_url //url video đã upload
$ movie.video_url :thumb //url video thumbnail
https://github.com/carrierwaveuploader/carrierwave
https://github.com/evrone/carrierwave-video-thumbnailer
https://www.howtoinstall.co/en/ubuntu/xenial/ffmpegthumbnailer
https://brewinstall.org/install-ffmpegthumbnailer-on-mac-with-brew/