+7

Sử dụng AWS MediaConvert để xử lí auto convert video HD sang SD

image.png

Introduction

Vào một ngày bạn gặp phải yêu cầu của khách hàng:

  • Chuyển đổi video từ định dạng HD sang SD để tiết kiệm tài nguyên
  • Việc convert bắt đầu khi có 1 file video được upload lên S3
  • Quá trình hoàn toàn tự động

Mình sẽ sử dụng các dịch vụ trên AWS để giải quyết bài toán trên. Ưu điểm việc dùng AWS sẽ dễ dàng quản lý, triển khai, liên kết các service. Nếu cần tích hợp thêm thông báo sau khi xử lí xong thì có thể tích hợp nhanh chóng. Có nhiều định dạng video theo mong muốn của người dùng.

Source code Lambda: https://github.com/dtdat1997/aws-lambda-transcoding-video-by-aws-mediaconvert

Bài viết này khá dài rất mong mọi người có thể cùng mình theo dõi tới cuối bài 😅😅

Workflow

Các dịch vụ trên AWS sẽ sử dụng tới

  • AWS S3: kho chứa các file media, video input/output
  • AWS Elemental MediaConvert: công cụ xử lí convert/transcoding video
  • AWS Lambda: viết function xử lí trung gian, trong bài toán này xử lí input/output, các tham số khi convert video
  • AWS EventBridge (AWS CloudWatch Events): quản lý các logs, sự kiện khi có video được upload lên S3
  • AWS IAM: tạo các role, policy cần dùng để xử lí bài toán

Screenshot_2.png

Mô tả:

  1. Quá trình bắt đầu khi có event upload file video (Object Created) lên S3 bucket input
  2. EventBridge sẽ nhận biết sự kiện này truyền tới Lambda function
  3. Lambda function sẽ đọc file vừa upload, định nghĩa option convert file, output destination
  4. AWS MediaConvert nhận được input từ Lambda, sau quá trình convert sẽ chuyển file output vào S3 bucket output
  5. Quá trình hoàn tất

Workflow này các bạn cũng có thể dùng vào các bài toán tương tự như cải thiện audio, thêm caption vào video,....

Configuration

S3

Các bạn vào S3 để tạo 2 bucket input, output để chứa các video upload và video sau xử lý

Ở đây mình sẽ tạo 2 bucket có tên kid328-video-inputkid328-video-output

Lưu ý: không nhét dùng chung 1 bucket để chứa các file input lẫn output, vì ta sẽ bắt sự kiện objectCreated trên bucket, file convert xong nếu upload vào cùng bucket cũ sẽ bị sinh ra vòng lặp làm cho quá trình convert này chạy mãi, gây phát sinh chi phí

image.png

image.png

image.png

Giờ chúng ta sẽ bật Amazon EventBridge trên bucket input để bucket có thể gửi event vào EventBridge

Vào phần Properties của bucket input, tìm mục Amazon EventBridge, chọn Edit

image.png

image.png

Thay đổi sang On rồi ấn Save changes

Như vậy các bước setup S3 đã xong, tiếp tới chúng ta sẽ đi tạo Lambda function

MediaConvert

Trên S3 bucket input, ta up 1 video HD lên image.png

image.png

Trong MediaConvert, ta tạo 1 job

Ở phần input, ta chọn đường dẫn của file vừa tải lên

image.png

Sau Add một Output groups, chọn File group

image.png

image.png

Ta nhập vị trí bucket output

image.png

Trong output setting, ta điền thông tin file sau khi convert và chọn Preset (các option convert định dạng file video)

image.png

Có rất nhiều option cho bạn lựa chọn, ở đây mình sẽ lấy 1 định dạng file SD để convert về

Tiếp đến ta vào mục AWS integration, ta sẽ tạo một role mới full permission trên S3 và APIGatewayInvoke để cho MediaConvert chạy được job này

Ở đây mình tạo role có tên AmazonMediaConvertUsingS3AndAPIGateway

image.png

Sau khi đã điền xong thông tin ta ấn Create để Job này được tiến hành

Khi sang màn hình dashboard job ta sẽ thấy job vừa tạo đang được xử lý

image.png

Sau vài phút, job đã convert xong, ta cùng vào bucket output để xem kết quả

image.png

image.png

File video HD ban đầu có dung lượng 11Mb sau khi convert về SD chỉ còn 1.3Mb

image.png

Ta quay lại Job detail của job vừa rồi chọn Export JSON

Trong file json vừa lấy về chúng ta lấy

  • 2 thông tin OutputGroupsInputs vào nhét vào 1 file json riêng đặt tên là job.json
  • Phần Role, ta copy lại value để dùng cho Lambda function, ở đây mình lấy được role value dạng
arn:aws:iam::{{aws_user_id}}:role/service-role/AmazonMediaConvertUsingS3AndAPIGateway

image.png

Như sau quá trình trên ta đã có file job template để các file convert tự động sau có thể sử dụng template convert này

Lambda

Vào Lambda, chọn Create function

Ở đây mình tạo function có tên là convert-video, mình sẽ dùng Python v3.8 để viết function

image.png

Chúng ta config các environment variables cho function

Chọn Configuartion >> Environment variables >> Edit

image.png

image.png

Mình điền 3 biến Application , DestinationBucket(ta điền tên bucket output), MediaConvertRole (ta lấy role value lấy được ở phần trên để điền vào)

Các bạn clone repository dưới đây để lấy code up lên Lambda nhé

https://github.com/dtdat1997/aws-lambda-transcoding-video-by-aws-mediaconvert

Ta chọn upload .zip file

image.png

image.png

File job.json này ta đã có được ở phần trên

Sau khi upload code, ta ấn Deploy

Lưu ý: trong một vài trường hợp việc xử lý Lambda bị mất thêm thời gian đọc file từ S3, bạn cần tăng timeout của Lambda lên nhé

EventBridge

image.png

Ta vào service EventBridge, chọn Create rule

image.png

Ở đây mình tạo event có tên video-convert-uploaded, bấm Next

image.png

Trong phần Event pattern, chúng ta chọn event type như trên vào chỉ check trong bucket input thôi nhé

image.png

Tại step Select target(s), ta chọn Lambda vừa tạo bên trên

Ta next đến bước cuối cùng và chọn Create rule

image.png

Lambda đã nhận được trigger event trên

Công đoạn setup cuối cùng là IAM, để cung cấp thêm quyền xử lí cho Lambda function

IAM

Để tới nhanh Role, ta vào Configuration >> Permissions và ấn vào Role name

image.png

image.png

Chọn Attach policies

Ta cần thêm các policy sau

  • AmazonS3FullAccess
  • AWSElementalMediaConvertFullAccess

Test

Như vậy sau một quá trình dài setup, ta cùng thử kiểm tra thành quả nhé

Ta upload một file video HD lên S3 bucket input

Mình upload một file video-test1.mp4 lên bucket kid328-video-input

image.png

Vậy là phía MediaConvert đã nhận được job và tiến hành xử lý

Status bên MediaConvert là COMPLETE thì job đã xử lý thành công

image.png

image.png

image.png

Lưu ý: Nếu có lỗi xảy ra bạn có monitoring trong Cloudwatch Logs group

Cảm ơn mọi người đã theo dõi bài viết tới cuối 😀😀

Source code Lambda: https://github.com/dtdat1997/aws-lambda-transcoding-video-by-aws-mediaconvert


Nguồn tham khảo: https://aws.amazon.com/vi/blogs/media/vod-automation-part-1-create-a-serverless-watchfolder-workflow-using-aws-elemental-mediaconvert/


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í