Chuyển đổi video với nhiều filter phức tạp dùng FFmpeg

Saturday, July 27, 2019
Edit this post


Nếu chưa biết FFMPEG là gì, thì các bạn có thể đọc trước ở đây nhé. Còn bây giờ chúng ta hãy thử ứng dụng FFMPEG vào một việc gì đó cụ thể nào.

Giả sử tôi có một bộ phim định dạng mp4 ở độ phân giải 1080p, yêu cầu đặt ra là phải re-scale video này về 720p, tăng tốc bộ phim lên nhanh hơn 15%, lồng thêm logo (watermark), lồng thêm phụ đề hardsub, sau đó render thành một file video mới.

Giả sử không có FFMPEG trong tay, sẽ có khó có công cụ nào có thể đáp ứng hết được những yêu cầu trên chỉ với một lần render duy nhất, nếu có thì gần như chắc chắn phải là công cụ trả phí. Nếu chỉ dùng công cụ miễn phí, tôi sẽ cần ít nhất 2 lần render: Đầu tiên tôi dùng Handbrake để hardsub và đưa bộ phim về 720p trước, sau đó tôi tiếp tục dùng một trình biên tập video nào đó để chỉnh tốc độ video và gắn thêm watermark vào.

Với FFMPEG bạn chỉ cần một dòng lệnh duy nhất để đáp ứng toàn bộ yêu cầu trên:


ffmpeg -i video.mp4 -i logo.png -filter_complex "[0:0]setpts=0.85*PTS[i];[i]scale=1280:720[j];[j]subtitles=video.srt[k];[k]overlay=10:10[l];[0:1]atempo=1/0.85[p]" -map "[l]" -map "[p]" -preset slow -crf 18 video_new.mp4

Giải thích:

-i là để báo cho chương trình biết các input đầu vào, ở đây bao gồm file video.mp4 và file watermark logo.png.

Filde video.mp4 ở đây tôi sẽ sử dụng file này (video được tôi tải từ YouTube có tên "The disarming case to act right now on climate change | Greta Thunberg"):


Sau đó tôi tiếp tục tải phần phụ đề tiếng Việt của video, đổi tên thành video.srt, đặt tất cả (video.mp4, video.srt, logo.png) vào chung một thư mục như sau:


Với các loại render có nhiều yêu cầu phức tạp, chúng ta cần phải kết hợp nhiều filter với nhau, do đó lựa chọn thích hợp nhất là sử dụng filter complex.

File video của tôi ở đây chỉ có 2 stream duy nhất: stream 0:0 là video, còn stream 0:1 chính là audio. Có những file video sẽ có nhiều hơn 2 stream, dễ thấy nhất là các file phim MKV có nhiều audio track ứng với các ngôn ngữ khác nhau.

Để biết chính xác file video của bạn có những stream nào, đơn giản sử dụng lệnh:

ffmpeg -i video.mp4

Như các bạn thấy bên dưới thì file video.mp4 chỉ có 2 stream là 0:0 và 0:1.


Câu lệnh [0:0]setpts=0.85*PTS[i]; giúp tăng tốc của video lên 85% (muốn tăng tốc video lên gấp đôi, tức 50% thì đổi thành [0:0]setpts=0.5*PTS[i];). i ở đây là một tên tham số do tôi tự đặt, có tác dụng đặt tên cho đầu ra là i, nếu bạn apply thêm filter cho video thì i sẽ là đầu vào cho filter tiếp theo. Ví dụ câu lệnh tiếp theo [i]scale=1280:720[j]; như bạn thấy ở đây thì đầu vào của filter scale là i, tôi scale video về 720p, sau đó đặt tên cho đầu ra của scale filter là j. Tương tự như vậy tôi apply tiếp filter subtitles [j]subtitles=en.video[k] và đặt tên đầu ra là k. Cuối cùng tôi chỉ vị trí gắn logo bằng filter overlay [k]overlay=10:10[l]; với k là đầu vào từ filter subtitles và l là đầu ra của filter overlay.

Sau đó, tôi chuyển filter audio tempo cho track audio 0:1, [0:1]atempo=1/0.85[p]. Vì video tăng tốc nhưng audio sẽ không tăng theo, nếu không có câu lệnh này, video sau khi xuất xong sẽ có hiện tượng hình nhanh hơn tiếng, không ăn khớp nhau. Để 2 stream này khớp nhau, bạn chỉ cần gán tốc độ là 1 chia cho chính giá trị tăng tốc của video (ở đây 0.85). Đầu ra của filter atempo tôi đặt tên p.

Vì không apply thêm filter nào nữa nên tôi map 2 stream đã xử lý vào video mới bằng lệnh -map "[l]" -map "[p]" với l là đầu ra cuối cùng dãy filter video, và p là đầu ra cuối cùng của dãy filter audio.

Câu lệnh -preset slow không bắt buộc phải có, nó chỉ định thời gian nén của video. Ví dụ nếu bạn chọn ultrafast thì thời gian xử lý sẽ là nhanh nhất, nhưng size của video output sẽ khá lớn. Ngược lại nếu bạn chọn càng chậm thì size càng nhỏ. Nếu bạn không chọn preset nào thì mặc định sẽ là medium. Danh sách các preset sẵn có xem bên dưới:

  • ultrafast
  • superfast
  • veryfast
  • faster
  • fast
  • medium – default preset
  • slow
  • slower
  • veryslow
-crf (constant rate factor) để chỉ định chất lượng của video output có giá trị trong khoảng từ 0 tới 51, với 0 là lossless. Mặc định nếu bạn không khai báo gì thì giá trị này là 23. Thông thường nếu bạn chọn preset là slow thì chọn crf là 17 hoặc 18 sẽ tối ưu nhất.

Cuối cùng, tôi đặt tên cho video sau khi được xử lý xong là video_new.mp4. Như các bạn thấy bên dưới thì video gốc có độ dài hơn 11 phút, nhưng video sau xử lý chỉ có hơn 9 phút rưỡi mà thôi. Đó là kết quả của việc xử lý tăng tốc video và audio.

Và đây là kết quả cuối cùng:


Không quá đơn giản, nhưng cũng không quá phức tạp phải không nào? Chúc các bạn thành công!!!

.
Xin vui lòng chờ đợi
Dữ liệu bài viết đang được tải về

💻Nhận dạy online 1 kèm 1 Automation Test từ cơ bản tới nâng cao (From Zero to Hero) 😁😁😁
Lộ trình gồm 3 phần:
1) Kỹ thuật lập trình và tư duy lập trình cơ bản
2) Nhập môn kiểm thử (Manual Test)
3) Kiểm thử tự động (Automation Test) + Chuẩn bị cho phỏng vấn
* Lộ trình chi tiết: Xem tại đây

🎓Đối tượng người học:
- Những bạn bị mất gốc căn bản môn lập trình.
- Những bạn muốn theo con đường kiểm thử (testing), đặc biệt là kiểm thử tự động (Automation Test).

🦘Người giảng dạy:
- Mình sẽ là người trực tiếp hướng dẫn.
- Nếu là các vấn đề ngoài chuyên môn hoặc sở trường, mình sẽ nhờ các anh chị em khác cũng làm trong ngành.

🤓Giới thiệu:
- Mình đã có hơn 10 năm kinh nghiệm làm IT ở cả trong và ngoài nước. Trong đó 3 năm đầu là làm lập trình viên Java, sau đó bén duyên với mảng Automation Test và theo nghề tới tận bây giờ. Mình được đào tạo chính quy về IT từ một trường Đại học danh tiếng ở TP.HCM (hệ kỹ sư 4 năm rưỡi), có chứng chỉ ISTQB, có thể giao tiếp tốt bằng tiếng Anh và có kinh nghiệm làm việc thực tế ở cả 2 mảng Outsource và Product. Title chính thức của mình là QA Automation Engineer, tuy nhiên, mình vẫn làm những dự án cá nhân chuyên về lập trình ứng dụng như Học Tiếng Anh StreamlineSách Nhạc. Mình là người có thái độ làm việc chuyên nghiệp, chăm chỉ và luôn nhiệt tình trong công việc.

💵Chi phí và hình thức thanh toán:
- Các bạn vui lòng liên hệ qua email songtoigianvn@gmail.com (email, chat, hoặc call) để book nội dung và khung giờ học (từ 8h tối trở đi).
- Mức phí: 150.000đ/buổi, mỗi buổi 60 phút.
- Lộ trình From Zero to Hero: 4.350.000đ (29 buổi).
- Bạn có thể học riêng và đóng tiền theo từng phần nếu muốn.
- Có thể học trước 1-2 buổi trước khi quyết định đi full lộ trình hoặc từng phần.
- Thanh toán qua Momo, chuyển khoản v.v...
BÌNH LUẬN
© Copyright by CUỘC SỐNG TỐI GIẢN
Loading...