12/08/2018, 13:01

Xử lý video trong Rails với gem paperclip

Giới thiệu Với những trang web phục vụ truyền thông đa phương tiện, công việc phổ biến nhất của server là phục vụ upload/download các file ảnh, ca nhạc và video. Gem Paperclip là công cụ hữu ích để xử lý những file này. Cài đặt Để có thể sử dụng Paperclip, đầu tiên ta cần cài đặt các công cụ ...

Giới thiệu

Với những trang web phục vụ truyền thông đa phương tiện, công việc phổ biến nhất của server là phục vụ upload/download các file ảnh, ca nhạc và video. Gem Paperclip là công cụ hữu ích để xử lý những file này.

Cài đặt

Để có thể sử dụng Paperclip, đầu tiên ta cần cài đặt các công cụ phục vụ backend cho gem này. Bài viết này giới thiệu ffmpeg, là công cụ hỗ trợ chỉnh sửa ảnh, video và audio mạnh mẽ và dễ sử dụng.

Việc cài đặt và sử dụng ffmpeg được giới thiệu chi tiết trên trang chủ FFmpeg. Để sử dụng ffmpeg linh hoạt hơn, bài viết giới thiệu gem Streamio FFMPEG

Sau đó, ta chỉ cần thêm dòng sau vào Gemfile để cài đặt Paperclip và plugin để sử dụng ffmpeg:

gem "paperclip"
gem "paperclip-av-transcoder"

Cuối cùng là cài đặt:

bundle install

Đưa Paperclip và sử dụng

Tại model mới sử dụng Paperclip:

Để tạo model mới, ta sử dụng rail g như bình thường, chỉ cần thêm một trường thuộc kiểu attachment. Ví dụ:

rails g model Post title:string body:string video:attachment

Rails sẽ tự tạo 4 trường tương ứng để Paperclip hoạt động. Với ví dụ trên thì 4 trường được tạo ra có dạng:

video_file_name
video_content_type
video_file_size
video_updated_at

Thêm Paperclip vào một model có sẵn:

Việc thêm Paperclip vào model có sẵn cũng tương tự như tạo mới model, ta chỉ cần thêm trường thuộc kiểu attachment vào bảng. Ví dụ:

add_attachment :posts, :video

Các trường được thêm vào bảng tương tự với trường hợp trên

Thêm xử lý Paperclip

Sau khí có các trường cần thiết trong model, ta thêm xử lý vào trong model:

attached_file :video, styles: {
    medium: {geometry: "640x480", format: "flv"},
    thumb: {geometry: "100x100", format: "jpg", time: 10}
  }, processors: [:transcoder]

Trong đó, các giá trị của syle sẽ quy định các thuộc tính của file.

  • Thuộc tính medium quy định độ phân giải của video nếu video có cùng tỉ lệ với độ phân giải trong geometry. Nếu không, video sẽ được giữ nguyên chiều rộng và tính toán lại chiều cao để phù hợp với độ phân giải (video sẽ được thêm hai vạch đen ở trên và dưới để đảm bảo độ phân giải).
  • Thuộc tính thumb quy định một screenshot của video làm hình đại diện.

Các xử lý cho video có thể thực hiện dưới sự hỗ trợ của ffmpeg ở callback function hoặc controller bằng cách gửi request trực tiếp đến ứng dụng ffmpeg hoặc thông qua gem Streamio được giới thiệu ở đầu bài viết.

Upload view

Sau khi model đã có khả năng xử lý Paperclip, ta cần thêm vào form. Đầu tiên, kích hoạt multipart của form:

<%= form_for @post, html: {multipart: true} do |f| %>

Sau đó, đặt một trường để upload file:

<%= link_to video_tag(@post.video.url(:medium)), @post.video.url %>

Validations

Việc validate cho attachment rất đơn giản. Ta có thể validate present:

validates :video, attachment_presence: true

hoặc

validates_attachment :video, presence: true

Dung lượng file:

validates_attachment :video, size: {in: 0..100.kilobytes}

Kiểu file:

validates_attachment :video, content_type: {content_type: "video/flv"}

Kết hợp các kiểu trên:

validates_attachment :video, presence: true,
  content_type: {content_type: "video/flv"},
  size: {in: 0..100.kilobytes}

0