0

Upload video và thay đổi định dạng dùng service AWS

Xin chào các bạn đã đến với bài viết của mình. Hiện nay việc lưu trữ và sử dụng file hoặc trên ứng dụng là vô cùng phổ biến, cùng với đó là sự phát triển đa dạng về những hệ thống lưu trữ online để người dùng không cần phải lưu dữ liệu kiểu video hoặc ảnh dưới hệ thống.

Sau đây mình xin giới thiệu các bạn một service mà có lẽ đã được rất nhiều người biết đến, và được sử dụng rộng rại trong rất nhiều hệ thống với nhiều ngôn ngữ sử dụng khác nhau. Đó là chính là Amazon Web Service viết tắt là AWS. Cụ thể bài viết mình sẽ hướng dẫn các bạn cách cấu hình và upload file lên hệ thống lưu trữ của AWS, dùng ngôn ngữ là Ruby On Rails.

1: Cách cấu hình hệ thống và cách gửi file lên AWS?

1.1 Cấu hình hệ thống:

  • Đầu tiên, hệ thống của bạn nên dùng gem paperclip để upload file.

  • Tiếp theo là các cấu hình khi sử dụng S3(một service của AWS riêng dùng để lưu trữ file)

    • Đầu tiên, thêm dòng sau vào Gemfile:

        gem "aws-sdk", ">= 2.0"
      
    • Sau đó trong command chạy

        bundle install
      
    • Tiếp theo, trong thư mục config/environments/xxx.rb (xxx là mội trường sử dụng, VD: development, production...), thêm vào như sau:

        config.paperclip_defaults = {
            storage: :s3, #Lưu trữ trên s3
            bucket: ENV["AWS_BUCKET"],
            s3_region: ENV["AWS_REGION"],
            s3_credentials: {
              access_key_id: ENV["AWS_ACCESS_KEY_ID"],
              secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"]
            }
          }
      

      -> Các biến ENV là biến môi trường tương ứng với nội dung trong biến ENV đã ghi 1.2 Cấu hình model:
      Trong models sẽ cấu hình để có thể gửi video lên trên S3 như sau:

    • Đầu tiên phải có trường kiểu attachment để lưu trữ file với gem paperclip, ví dụ mình có một model là Users, trường lưu video của mình là trường file như sau.

        	class CreateUsers < ActiveRecord::Migration
              def change
                create_table :users, do |t|
                  t.attachment :file
                end
              end
            end
      
    • Khi đó, trong thư file app/model/user.rb sẽ cấu hình như sau:

                    class User < ActiveRecord::Base
                      has_attached_file :file, storage: :s3,
                        hash_secret: Settings.hash_key, #secret key
                        path: "videos/:basename.:extension" #url lưu file trên s3
                    end
      
    • Và trong view app/views/users/xxx.rb sẽ thêm field như sau:

       	<%= form.file_field :file %> 
          -> Đó là những bước cấu hình để có thể gửi một file lên lưu trữ trên S3, cực kì đơn giản và hiệu quả.
      
    • Khi muốn lấy ra url của file bạn đã lưu chỉ cần gọi:

      	User.first.file.url
      

      -> Đó là tất cả những việc để có thể upload một file nào đó lên lưu trữ trên S3.

    2: Việc chuyển đổi định dạng cho video

    2.1 Tại sao lại phải thay đổi định dạng cho video? - Bởi vì video upload lên quá nặng, tốn tài nguyên. - Bởi vì video upload lên không đúng định dạng mà KH yêu cầu. - Bởi vì rất nhiều lý do khác khiến bạn muốn sử dụng service đổi định dạng này(thumbnail...) 2.2 Vậy muốn thay đổi định dạng cho video upload cần bắt đầu từ đâu? - B1: Đăng nhập vào trang chủ của AWS, chọn Elastic Transcoder. - B2: Tạo ra một Pipeline, lưu lại pipeline_id (sẽ dùng để transcode) - B3: Tạo ra một preset, lưu lại preset_generic_id(sẽ dùng để transcode) -> Trong này, các bạn sẽ điều chỉnh thông số cho video mình sẽ chuyển thành(định dạng, độ phân giải, thumbnails...) -> Đã hoàn thiện phần cấu hình phía S3 - B4: Cấu hình trên Rails. Sau khi cấu hình xong bên phía server, ta chỉ cần viết một callback sau khi create video đó như sau:

    after_create_commit :aws_transcoder #Dùng after_create_commit vì để chỉ transcode sau khi upload file đã thành công
    
    def aws_transcoder
      job = ELASTIC_TRANSCODER.create_job({
        pipeline_id: ENV["PIPELINE_ID"], #PIPELINE_ID đã đề cập ở trên
        input: {
          key: "#{self.video.path}", #path của video đã upload (do mình đã cấu hình khi upload video)
          frame_rate: "auto", #các thông số
          resolution: "auto",
          aspect_ratio: "auto",
          container: "auto"
        },
        outputs: [{
          key: "<path>.mp4", #path àm bạn muốn xuất video sau khi transcode
          preset_id: ENV["PRESET_ID"], #PRESET_ID đã đề cập ở trên 
          rotate: "auto",
          thumbnail_pattern: "<path>/{count}" #path muốn lưu thumbnails, "{count}" là bắt buộc để có thể xuất ra các file thumbnails 
          }]
        })
    end
    

    -> Và như vậy, các bạn đã thực hiện thành công các bước để có thể upload một file tài liệu lư trữ trên S3 và có thể chuyển đổi định dạng video upload lên bằng service Elastic Transcoder. Các bạn có thể làm thử và xem kết quả ra sao.

    Kết luận

    Thật dễ dàng để có thể lưu trữ khối lượng lớn file với dung lượng lớn bằng S3, các bạn có thể thử dùng và nếu có khó khăn gì xin hãy đặt câu hỏi hoặc mail về thư: tuannd255@gmail.com. Mình rất mong có sự phản hồi của các bạn, bài viết không thể tránh khỏi sai sót, vậy nếu các bạn làm có lỗi hoặc do sự cố nào đó có thể liên hệ với mình, mình sẽ cùng các bạn giải quyết vấn đề để có thể có một bài viết hoàn chinh hơn. Xin chào và hẹn gặp lại các bạn trong bài viết tiếp theo của mình.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí