Sử dụng AWS MediaConvert để xử lí auto convert video HD sang SD
Bài đăng này đã không được cập nhật trong 2 năm
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
Mô tả:
- Quá trình bắt đầu khi có event upload file video (Object Created) lên S3 bucket input
- EventBridge sẽ nhận biết sự kiện này truyền tới Lambda function
- Lambda function sẽ đọc file vừa upload, định nghĩa option convert file, output destination
- AWS MediaConvert nhận được input từ Lambda, sau quá trình convert sẽ chuyển file output vào S3 bucket output
- 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-input và kid328-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í
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
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
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
Sau Add một Output groups, chọn File group
Ta nhập vị trí bucket output
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)
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
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ý
Sau vài phút, job đã convert xong, ta cùng vào bucket output để xem kết quả
File video HD ban đầu có dung lượng 11Mb sau khi convert về SD chỉ còn 1.3Mb
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 OutputGroups và Inputs 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
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
Chúng ta config các environment variables cho function
Chọn Configuartion >> Environment variables >> Edit
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
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
Ta vào service EventBridge, chọn Create rule
Ở đây mình tạo event có tên video-convert-uploaded, bấm Next
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é
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
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
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
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
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