Trong Series mình chia sẻ cho các bạn tầm quan trọng của FFmpeg đối với 1 MMO Youtube thì mình đã chia sẻ những câu lệnh trong FFmpeg để có thể biên tập lại 1 Video và sẵn sàng kiếm tiền trên Youtube. Đối với những bạn không quan tâm nhiều lắm đến mẫu làm ra Video thì không nói, còn những bạn chuyên vọc vạch và thay đổi Code thì bài này cực kỳ hiệu quả. Bài này sẽ nói gọn và tối ưu nhất những dòng code ffmpeg lách âm thanh hình ảnh và các bạn sẽ thấy sự tiện lợi của phương pháp này.
Các bạn cứ tưởng tượng rằng, mình làm việc với FFmpeg thì những thông số có được từ đâu ra. Ví dụ các bạn lách Video thu nhỏ trên một Video khác thì mỗi lần các bạn thu nhỏ tỉ lệ video, rồi căn vị trí video trên nền Background thì các thông số bạn test làm sao thay đổi cho nhanh chóng và hiệu quả.
Giả sử các bạn muốn thay đổi kích thước Video thì mình dùng scale=x:y, khi các bạn có thông số chuẩn rồi thì không bàn làm gì, nhưng bây giờ các bạn muốn nó to hơn, hay nhỏ hơn thì thủ công các bạn phải thay đổi thông số x và y. Vậy có cách nào thay đổi nó nhanh hơn không? Và tiếp theo giống như Video thu nhỏ nằm trên video Background thì làm sao mình căn cho nó cách một lề nào đó trong Video là bao nhiêu? Và nữa các bạn muốn Boder thêm vào trên video thì làm sao để tính toán thông số và lựa chọn màu sắc Boder. Nếu các bạn làm thủ công tính toán tỉ mỉ thì mình không nói làm gì, ở đây mình muốn chia sẻ cho các bạn các làm nhanh nhất để lúc mình test có thể tối ưu nhất.
Các bạn đã hiểu mình nói gì chưa nhỉ. Thôi nói nhiều không thực hành thì cũng như không. Mình bắt đầu giải thích cho các bạn những gì mình nói ở trên nhé.
Đây là đoạn code của bài hôm nay:
ffmpeg -y -i input.mp4 -i “fr.png” -filter_complex “[0:v]setpts=PTS/1.15,boxblur=2:1,scale=iw/1.7:-1,pad=iw+20:ih+20:10:10:color=white [v1]; movie=nen.mp4:loop=999,setpts=N/(FRAME_RATE*TB) [v2]; [v2][v1]overlay=shortest=1:x=W-w-30:y=H-h-30 [v3]; [v3][1:v]overlay=0:0,setdar=16/9; [0:a]atempo=1.15, aecho=0.4:0.66:2:0.2, chorus=0.5:0.9:50|80:0.4|0.42:0.25|0.4:2|1.4, firequalizer=gain_entry=’entry(100,0); entry(400, -4); entry(1000, -6); entry(2000, 0)’,equalizer = f = 1000: width_type = q: width = 1: g = 2, equalizer = f = 100: width_type = q: width = 2: g = 5,pan=stereo|c0<c0+0*c1|c1<c0+0*c1,aeval=val(0)|val(1),volume=3” -vcodec libx264 -pix_fmt yuv420p -r 30 -g 60 -b:v 1000k -minrate 1000k -maxrate 1000k -profile:v main -level 3.1 -acodec libmp3lame -b:a 128k -ar 44100 -preset superfast “output.mp4”
Nhìn đoạn code trên thì có những vấn đề mình muốn chia sẻ với các bạn. Đây là đoạn code lách thu nhỏ Video trên một Video nền, có thêm logo và có lách âm thanh cơ bản. Các video đầu vào và logo phải chuẩn 1280×720 cả nhé. Đoạn code này xử lý khác với những đoạn code trong bài trước.
- Vấn đề Video đầu vào (input.mp4): Đây là Video mình cần xử lý, ví dụ như 1 tập phim chẳng hạn,bây giờ mình muốn thu nhỏ nó lại theo tỷ lệ nào đó, các bạn có thấy scale=iw/1.7:-1. Tại sao không viết tỉ lệ cụ thể như 854:480? Ý mình muốn nói là ở đây. Các bạn viết cụ thể ra như vậy thì giả sử các bạn muốn video đó to hơn hoặc nhỏ hơn thì phả thay lại hai thông số x:y này. Thay 1 lần không nói chứ thay nhiều lần để test xem tỷ lệ đó đã qua bản quyền chưa thì hơi mệt. Với cách viết trên thì mình có thể nhanh chóng thay con số 1.7 trong iw/1.7 thành số khác ví dụ như 1.5 để video lớn hơn hoặc =2 để video nhỏ hơn.
- Cũng về Video input các bạn có thấy dòng lệnh tạo boder (viền màu quanh Video) pad=iw+20:ih+20:10:10:color=white. Với các thông số đã cho thì mình thấy rằng viền này có màu trắng (white), các bạn có thể thay màu khác bằng tên màu trong tiếng Anh như blue (xanh), black (đen), red (đỏ), yelow (vàng)…vv. Câu lệnh này cũng đơn giản hơn cho việc căn border sao cho chuẩn với Video. Với thông số iw và ih là chiều dài và rộng của Video thì với viền ở đây là 10pixel thì thông số iw+20:ih+20 = iw+10*2: ih+10*2. Nhiều câu lệnh tính toán ra thông số rồi viết vào nhưng sẽ mất thời gian hơn rất nhiều.
- Về vấn đề Video nền: Mình không cần Video nền phải dài hơn Video đầu vào nữa, chỉ cần một đoạn Video thôi và mình sử dụng chức năng lặp liên tục Video khi nó kết thúc movie=nen.mp4:loop=999 vì thế đã đơn giản đi việc phải tạo 1 background thật dài, các bạn lên mạng thấy video nào ưng ý có thể down về, dù ngắn thôi nhưng việc lặp sẽ làm video kéo dài bằng video gốc của mình.
- Tiếp đến là đoạn overlay=shortest=1:x=W-w-30:y=H-h-30 đây là cách căn vị trí Video trên Video nền. Ở đây mình -30 để Video nằm ở phía dưới bên phải cách lề phải 30 và lề dưới 30. Thật tiện phải không, không cần phải tính toán ra thông số gì cho mệt. Làm cách này thì mình có thể điều chỉnh vị trí rất nhanh. Các bạn cứ thử đi rồi biết nhé, thử trừ đi một khoảng lớn hơn xem sao nhé.
Trên đây là những chia sẻ của mình về viêc tối ưu hóa câu lênh trong ffmpeg dành cho những bạn sử dụng ffmpeg chiến Youtube. Các bạn thấy thú vị thì có thể Bookmark chiaseall.com để cập nhật những bài mới nhé.
vgc0001 viết
Cho mình hỏi file fr.png để làm gì vậy b? Có thể cho mình xin file đó ko?
admin viết
Phải hơn 2 năm mình không đụng tới ffmpeg nữa bạn ơi. Nếu trong code đó thì file fr.png là file ảnh trong suốt để chèn lên Video đó bạn.
Hùng viết
filter_complex là gì thế bác
admin viết
Đây là thư viện xử lý hình ảnh nâng cao thôi, giống như -vf vậy đó.
chung viết
bác cho xin file phần mềm với ạ,e tải về mà chạy code này ko đc .
admin viết
Bạn copy code và chạy bình thường nhé, mình có thấy lỗi gì đâu, nếu có lỗi gì bạn cứ post lên cùng thảo luận nhé!
tuấn viết
mình muốn chạy code này để render hàng loạt tất cả video trong thu mục input rồi xuất ra thư mục output (giữ nguyên tên file) –> thì làm thế nào? Mình chỉnh mãi ko đc. thx bạn
admin viết
Bạn thay lại phần inphut và output thôi, có thể xem hướng dẫn trong bài viết này: https://chiaseall.com/tut-render-video-hang-loat-bang-ffmpeg/