Jump to content

Recommended Posts

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 :167788060085147: 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é.:167788130085140:

Trước hết là đồ dùng

Quote

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é.

CMRB1ih.png

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é

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites

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

 

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites

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

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

 

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites
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 ?

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites

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

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites
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

 

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites

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 ạ

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites
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

 

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites
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 ạ?

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites
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...

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites
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 ạ!!

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites
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

 

Chia sẻ bài đăng này


Link tới bài viết
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Trả lời chủ đề này...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...