Thiên Chi Kiều Nữ 965 Đã viết 7/04/2019 Xin chào các bạn, hôm nay mỵ có dự án về chỉnh sửa video, mấy thao tác đơn giản thôi nên tiện thể đăng lên cho các bạn cùng tham khảo, cũng chỉ là kiến thức cơ bản thôi, bạn nào biết thêm bổ sung giúp mỵ nhé. Trước hết là đồ dùng : Quote https://ffmpeg.zeranoe.com/builds/ Các bạn vào đây tải FFmpeg về cho máy nhé, chọn phiên bản win x64 hoặc x32, rồi tải luôn cái static là được, tải về các bạn giải nén lấy thư mục bin ném vào debug c# nhé. Giờ ta bắt đầu xử lý. Các bạn nên học qua chút về xử lý cmd bằng C Sharp đã nhé. [link viết sau] Giải thích qua ý nghĩa các param một chút nhé : Quote -i file.mp4 : xác định file đầu vào là file.mp4 -ss 0 : (start timespand) thời gian bắt đầu của file -t 5 : nghĩa là + thêm 5s nữa -to 5 : nghĩa là tới giây thứ 5 -c copy : copy nguyên, không cần render lại file -> nhanh hơn stream file. -vf : dùng để thông báo việc sử dụng video filter. Tiếp theo đó là công thức sử dụng. Để crop video với FFmpeg thì mình sử dụng công thức là crop=w:h:x:y. w: là chiều rộng video mà bạn muốn thu được. h: là chiều cao video mà bạn muốn thu được. x: là toạ độ trên trục x điểm top, left của video mong muốn, mặc định x = 0. y: là toạ độ trên trục y điểm top, left của video mong muốn, mặc định y = 0. Ở đây mỵ sẽ nói đến câu lệnh truyền vào CMD để thực thi thôi :") . Nếu có chỗ nào chưa hiểu rõ, các bạn cứ reply bài này nhé. Hiển thị thông tin file video : string CmdText = "ffmpeg -i test.mp4"; Chuyển đổi hình ảnh thành video : (tất nhiên là bạn nên có nhiều ảnh, không thì video chỉ có 1 hình thôi =.='' ) string CmdText = "ffmpeg -f image2 -i img%d.png video.mp4"; Chuyển đổi video thành hình ảnh : string CmdText = "ffmpeg -i video.mp4 image%d.png"; // tương tự với các đuôi ảnh khác nhé Tách âm thanh file video : string CmdText = "ffmpeg -i video.mp4 -vn -ar 44100 -ac 2 -ab 192k -f mp3 sound.mp3"; Chuyển đổi định dạng file video : string CmdText = "ffmpeg -i video_input.xxx video_output.yyy"; Ghép file video với file âm thanh : string CmdText = "ffmpeg -i sound.mp3 -i video_input.mp4 video_output.mp4"; Tăng giảm tốc độ phát video : string CmdText = "ffmpeg -i video.mp4 -vf "setpts=0.5*PTS" highspeed.mp4"; // chú ý : tăng tốc độ video lên 2 lần string CmdText = "ffmpeg -i video.mp4 -vf "setpts=2*PTS" highspeed.mp4"; // giảm tốc độ video xuống 2 lần Chèn ảnh vào file âm thanh tạo thành video : string CmdText = "ffmpeg -loop 1 -i image.png -i sound.mp3 -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4"; Chèn phụ đề (sub) cho video : string CmdText = "ffmpeg -i video.mp4 -i subtitles.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast video-output.mp4"; Cắt và lấy 1 đoạn của video : string CmdText = "ffmpeg -i video.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4"; Chia video thành nhiều phần (theo giây) : string CmdText = "ffmpeg -i video.mp4 -t 00:00:50 -c copy small-1.mp4 -ss 00:00:50 -codec copy small-2.mp4"; Ghép nhiều video nhỏ thành 1 video : (cùng định dạng file, bit rate...) string CmdText = "ffmpeg -f concat -i file-list.txt -c copy output.mp4"; *Chú ý : nôi dung file file-list.txt sẽ có dạng như sau: Quote file 'small-1.mp4' file 'small-2.mp4' Ghép nhiều video nhỏ thành 1 video sử dụng Concat Filter : string CmdText = "ffmpeg -i video1.mp4 -i video2.avi -filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output.mp4"; Ghép nhiều video nhỏ thành 1 video, nhưng không ghép tiếng : string CmdText = "ffmpeg -i video1.mp4 -i video2.avi -filter_complex "[0:v:0] [1:v:0] concat=n=2:v=1 [v]" -map "[v]" output.mp4"; Tắt âm thanh video : string CmdText = "ffmpeg -i video.mp4 -an mute-video.mp4"; Crop video : string CmdText = "ffmpeg -i input.mp4 -vf "crop=w:h:x:y" output.mp4"; ở đây mỵ sẽ giải thích thêm một tí , chúng ta nhìn hình cho dễ hiểu nhé. Giả sử mình có một video với độ phân giải 1920×1080. Mình muốn crop lấy video với độ phân giải 1280×720 và điểm top, lef có toạ độ là (320, 180). Khi đó, mình có w = 1280, h = 720, x = 320, y = 180. Suy ra câu lệnh cần dùng là: string CmdText = "ffmpeg -i input.mp4 -vf "crop=1280:720:320:180" output.mp4" Như vậy để áp dụng thành công thức thì ta có như sau : string CmdText = "ffmpeg -i input.mp4 -vf "crop=1280:720:(in_w-1280)/2:(in_h-720)/2" output.mp4" in_w : chiều dài của Video ->1280 : độ dài mong muốn in_h : chiều cao của Video -> 720 : độ cao mong muốn Tạm thời mỵ mới biết được như thế, bạn nào biết nhiều hơn có thể reply bên dưới để mỵ bổ sung. Tài liệu FFmpeg ngay trên trang chủ nhé 1 1 Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Thiên Chi Kiều Nữ 965 Đã viết 1/05/2020 Ghép nối video với FFmpeg I. Ghép nối video với FFmpeg đơn giản : Trích dẫn ffmpeg -i "concat:video1.avi|video2.avi" output.avi Giải thích : Trích dẫn -i là cờ dùng để xác định input, sau đó là đoạn string có dạng "concat:video1.avi|video2.avi|...|videoN.avi". output.avi là tên file output, với định dạng giống như các file input. II. Ghép nối video sử dụng Concat Filter : Trích dẫn ffmpeg -i video1.mp4 -i video2.avi -filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output.mp4 Giải thích : Trích dẫn -i là cờ dùng để xác định input, sau đó là tên file (video1.mp4, video2.avi) -filter_complex dùng để áp dụng filter, sau đó là công thức filter - nằm trong cặp dấu ngoặc kép [0:v:0] là video stream của file thứ nhất [0:a:0] là audio stream của file thứ nhất [1:v:0] là video stream của file thứ hai [1:a:0] là audio stream của file thứ hai concat=n=2:v=1:a=1 để xác định FFmpeg sẽ ghép nối (concat) 2 video (n=2) thành 1 video với 1 video stream (v=1) và 1 audio stream (a=1). [v][a] lần lượt là kết quả của video stream và audio stream, để sử dụng trong phần sau -map "[v]" -map "[a]" dùng để xác định rằng FFmpeg sẽ sử dụng video stream và audio stream từ bước trước (thay vì input) để đưa ra output. output.mp4 là tên file output Chú ý: Nếu file input có kích thước, tốc độ framerate và SAR khác nhau thì bạn cần phải xử lý video trước cho chúng về cùng kích thước, cùng tốc độ framerate và cùng SAR. Trên đây là cách để ghép nối 2 video. Còn nếu bạn muốn ghép 3 video (hoặc nhiều hơn) thì câu lệnh sẽ trở thành: Trích dẫn ffmpeg -i video1.mp4 -i video2.avi -i video3.webm -filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] [2:v:0] [2:a:0] concat=n=3:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output.mp4 III. Ghép nối video không có audio : Trích dẫn ffmpeg -i video1.mp4 -i video2.avi -filter_complex "[0:v:0] [1:v:0] concat=n=2:v=1 [v]" -map "[v]" output.mp4 Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Thiên Chi Kiều Nữ 965 Đã viết 4/09/2020 Thêm watermark cho video trong ffmpeg Thêm watermark cho video trong ffmpeg hay chèn ảnh vào video : ffmpeg -i {video_input} -i {image_watermark} -filter_complex "overlay={x}:{y}" {video_output} Các thông tin: Trích dẫn -i video_input: thông tin của video input. -i image_watermark: hình watermark. -filter_complex: -vf được sử dụng cho các bộ lọc đơn giản (one input, one output), and -filter_complex được sử dụng cho các bộ lọc phức tạp (one or more inputs, one or more outputs). Using -filter_complex will allow you omit the movie multimedia source filter and have a shorter command. - overlay={x}:{y} : đè hình watermark từ vị trí tọa độ x:y trên video. Một trong những code demo đơn giản nhất về việc thêm watermark: ffmpeg -i test.mp4 -i watermark.png -filter_complex "overlay=10:10" test1.mp4 Một số options dành cho Overlay, xem thêm tại : Trích dẫn https://ffmpeg.org/ffmpeg-filters.html#overlay-1 Trong một số trường hợp, bạn có thể không biết kích thước chính xác của các video mà bạn sẽ được watermarking. May mắn thay, có nhiều biến bạn có thể sử dụng để định vị vị trí watermark tốt hơn tùy thuộc vào kích thước của video. Các biến này bao gồm: Trích dẫn main_h – chiều cao của video. main_w – chiều rộng của video. overlay_h – độ cao của watermark. overlay_w – chiều rộng của watermark. Overlay Position Centered Sử dụng các biến này, chúng ta có thể định vị hình mờ ở giữa video như sau: ffmpeg -i 03.mp4 -i logo.png \ -filter_complex "overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2" output.mp4 Có thể viết gọn (overlay=(W-w)/2:(H-h)/2). Với trường hợp chỉ có một input ffmpeg –i 03.mp4 -vf "movie=logo.png [watermark]; [in][watermark] overlay=overlay=(W-w)/2:(H-h)/2 [out]" output.mp4 Top left Đây là một tùy chọn dễ dàng vì nó là mặc định, nếu không có options nào thêm thì mặc định nó nằm ở vị trí top góc bên trái. Đây là một ví dụ hình hay video overlay nằm ở vị trí góc trên bên trái, cách top 5px và cách left: 5px. Trích dẫn overlay=5:5 Top right Với khoảng cách 5px với viền: overlay=main_w-overlay_w-5:5 viết rút gọn: overlay=W-w-5:5 Bottom right Với khoảng cách 5px với viền: overlay=main_w-overlay_w-5:main_h-overlay_h-5 viết rút gọn: overlay=W-w-5:H-h-5 Bottom left Với khoảng cách 5px với viền: overlay=5:main_h-overlay_h viết rút gọn: overlay=5:H-h-5 Trong trường hợp, bạn không muốn watermark đè trực tiếp lên video, bạn sử dụng pad filter. Sử dụng pad filter để tạo một vùng và đặt watermark lên vùng đó. Ví dụ: ffmpeg -i input.mp4 -i logo.png -filter_complex "pad=height=ih+40:color=#71cbf4,overlay=(main_w-overlay_w)/2:main_h-overlay_h" output.mp4 Notes Âm thanh đơn giản chỉ được sao chép lại ( stream copied (remuxed) ) trong ví dụ với -codec:a copy được copy thay vì re-encode lại. Bạn có thể mã hóa lại tùy thuộc vào đầu ra bạn muốn. Xem thêm các tài liệu về overlay video filterđể biết thêm thông tin và xem ví dụ. Đọc tài liệu FFmpeg H.264 Video Encoding Guide để bạn có thêm thông tin để tạo video chất lượng tốt hơn. Nếu hình ảnh bạn bao phủ bới các không gian màu RGB (ví dụ các ảnh PNG) bạn có thể cải tiến trực quan hơn bằng cách thêm format=rbg cho your overlay. nếu bạn xuất ra với thư viện H.264, thì bạn phải thêm format=yuv420p (đây là một filter khác). Ví dụ: overlay=5:H-h-5:format=rgb,format=yuv420p Show overlay image in a certain time span with ffmpeg (Hiển thị watermark từ giây thứ 1 đến giây thứ 20.) Code: ffmpeg -i input.mp4 -i logo.png -filter_complex "[0:v][1:v] overlay=10:10:enable='between(t,1,20)'" output.mp4 Show overlay image in a certain time span with ffmpeg, multi overlay images (Hiển thị watermark logo.png từ giây thứ 1 đến giây thứ 10, logo1.png từ giây thứ 8 đến giây thứ 20.) Code: ffmpeg -i input.mp4 -i logo.png -i logo1.png -filter_complex "[0:v][1:v] overlay=10:10:enable='between(t,1,10)' [tmp]; [tmp][2:v] overlay=main_w-overlay_w-10:10:enable='between(t,5,20)'" output.mp4 Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
DiaOcThongThai 0 Đã viết 17/09/2020 Cám ơn bạn. Bài viết rất chi tiết. Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Nguyen Hoang Luoc 1 Đã viết 4/09/2021 CHO EMXIN CODE CHEN TEXT VAO VIDEO ĐI Ạ CHO EM XIN CODE CHÈN TEXT VÀO VIDEO ĐI Ạ EM XIN CẢM ON Ạ 1 Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Thiên Chi Kiều Nữ 965 Đã viết 4/09/2021 58 phút trước, Nguyen Hoang Luoc said: CHO EMXIN CODE CHEN TEXT VAO VIDEO ĐI Ạ CHO EM XIN CODE CHÈN TEXT VÀO VIDEO ĐI Ạ EM XIN CẢM ON Ạ để ít hôm rảnh mỵ ngâm xem.. có add sub rồi mà nhỉ... hay bạn muốn add text như kiểu water mark ? Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Nguyen Hoang Luoc 1 Đã viết 4/09/2021 dạ text chử á ad. text vào video ký hiệu cho biết video của mình á ad 50 phút trước, Thiên Chi Kiều Nữ said: để ít hôm rảnh mỵ ngâm xem.. có add sub rồi mà nhỉ... hay bạn muốn add text như kiểu water mark ? ví dụ text thêm chữ đế nhận đinh video đó là của mình em có code này mà sao nó lỗi hoai ad giúp em với: ffmpeg -i phim.mp4 -vf drawtext=”fontfile=Roboto-Bold.ttf: text=’phim hayI’: fontcolor=white: fontsize=50: box=1: boxcolor=black: boxborderw=15: x=(w-text_w)/2: y=10″ -codec:a copy "phim.mp4" lỗi la At least one output file must be specified Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Thiên Chi Kiều Nữ 965 Đã viết 4/09/2021 2 giờ trước, Nguyen Hoang Luoc said: dạ text chử á ad. text vào video ký hiệu cho biết video của mình á ad ví dụ text thêm chữ đế nhận đinh video đó là của mình em có code này mà sao nó lỗi hoai ad giúp em với: ffmpeg -i phim.mp4 -vf drawtext=”fontfile=Roboto-Bold.ttf: text=’phim hayI’: fontcolor=white: fontsize=50: box=1: boxcolor=black: boxborderw=15: x=(w-text_w)/2: y=10″ -codec:a copy "phim.mp4" lỗi la At least one output file must be specified cmd này đúng rồi này bạn (chú ý đặt đường dẫn font cho đúng) : Trích dẫn ffmpeg.exe -i phim.mp4 -vf "drawtext=fontfile='font/HLcomic1_normal.ttf':text='Team Code Dao':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2" -codec:a copy phim_output.mp4 Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Daokbc 0 Đã viết 29/03/2022 Cho mình hỏi có code edit zoom video toàn bộ trong một thư mục k ạ Cho mình hỏi có code edit zoom video toàn bộ trong một thư mục k ạ Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Thiên Chi Kiều Nữ 965 Đã viết 31/03/2022 On 29/3/2022 at 22:15, Daokbc said: Cho mình hỏi có code edit zoom video toàn bộ trong một thư mục k ạ Cho mình hỏi có code edit zoom video toàn bộ trong một thư mục k ạ Mỵ tìm được đoạn này bạn test thử xem nhé. Trích dẫn zoompan=z=pzoom+0.01:x='iw/2-iw/zoom/2':y='ih/2-ih/zoom/2':d=1:s=1280x720:fps=30 Hoặc bạn có thể xem ví dụ xem : Trích dẫn https://ostechnix.com/zoom-in-and-zoom-out-videos-using-ffmpeg/ Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Cao Xuân Hưng 0 Đã viết 31/03/2022 Cho mình hỏi code là "ffmpeg -f image2 -i img%d.png video.mp4" thì tên file mình lưu là gì vậy ạ?? On 31/3/2022 at 22:57, Cao Xuân Hưng said: Cho mình hỏi code là "ffmpeg -f image2 -i img%d.png video.mp4" thì tên file mình lưu là gì vậy ạ?? Ví dụ như mình muốn chuyển 1 file ảnh .jpg sang video tầm 10s được không ạ? Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Thiên Chi Kiều Nữ 965 Đã viết 2/04/2022 On 31/3/2022 at 22:57, Cao Xuân Hưng said: Cho mình hỏi code là "ffmpeg -f image2 -i img%d.png video.mp4" thì tên file mình lưu là gì vậy ạ?? Ví dụ như mình muốn chuyển 1 file ảnh .jpg sang video tầm 10s được không ạ? 1. Tên file lưu là video.mp4 đấy bạn ... 2. được bạn... Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Cao Xuân Hưng 0 Đã viết 2/04/2022 4 giờ trước, Thiên Chi Kiều Nữ said: 1. Tên file lưu là video.mp4 đấy bạn ... 2. được bạn... À ý mình hỏi là tên file đầu vào. Mình đổi tên file thành img1.png, img2.png,... rồi nhưng vẫn không được :(( Ví dự mình muốn chuyển 1 file đầu vào tên là input.jpg và xuất ra thành output.mp4 thời lượng 10 giây thì dùng code nào được ạ? Mình mò mấy hôm nay không được, bạn giúp mình với. Mình cảm ơn ạ!! Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Thiên Chi Kiều Nữ 965 Đã viết 2/04/2022 3 giờ trước, Cao Xuân Hưng said: À ý mình hỏi là tên file đầu vào. Mình đổi tên file thành img1.png, img2.png,... rồi nhưng vẫn không được :(( Ví dự mình muốn chuyển 1 file đầu vào tên là input.jpg và xuất ra thành output.mp4 thời lượng 10 giây thì dùng code nào được ạ? Mình mò mấy hôm nay không được, bạn giúp mình với. Mình cảm ơn ạ!! file đầu vào như bạn viết : img%d.png nó sẽ tương ứng với img1.png, img2.png vv..v.. nhé. Chuyển image thành video thì bạn có thể tham khảo tại đây : Trích dẫn https://stackoverflow.com/questions/24961127/how-to-create-a-video-from-images-with-ffmpeg Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites
Cao Xuân Hưng 0 Đã viết 4/04/2022 Cảm ơn bạn nhiều nha Trích dẫn Chia sẻ bài đăng này Link tới bài viết Share on other sites