Tạo video với 5 hình ảnh với hiệu ứng fadeIn / out trong ffmpeg


27

Với 5 hình ảnh tôi phải tạo một video 60 giây trong ffmpeg, mỗi hình ảnh phải hiển thị trong 15 giây. sau 15 giây, hình ảnh đầu tiên phải mờ dần và hình ảnh thứ 2 phải mờ dần, sau đó hình ảnh thứ 2 phải mờ dần, hình ảnh thứ 3 phải mờ dần trong..v.v. Vui lòng hướng dẫn tôi làm thế nào tôi có thể đạt được điều này bằng cách sử dụng các lệnh ffmpeg.


4
Bạn đã thử những gì và sau đó chúng tôi có thể hỗ trợ bạn? Diễn đàn này không phải là loại diễn đàn "vui lòng cho tôi câu trả lời mà không thực hiện bất kỳ công việc nào". Như đã nói, tôi sẽ cung cấp cho bạn liên kết đến tài liệu ffmpeg fade - ffmpeg.org/ffmpeg-filters.html#fade
Mike Diglio

Câu trả lời:


49

Nhúng / phai màu đen

Cuộn xuống cho phương thức crossfade.

ví dụ mờ dần

Ví dụ trong đó mỗi hình ảnh được hiển thị trong 5 giây và mỗi hình ảnh có độ mờ kéo dài 1 giây. Mỗi đầu vào hình ảnh có cùng chiều rộng, chiều cao và tỷ lệ khung hình mẫu. Nếu chúng khác nhau về kích thước, xem ví dụ # 3 dưới đây.

Đầu ra MP4

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Với âm thanh

Tương tự như trên nhưng với âm thanh:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

Đối với hình ảnh đầu vào với kích thước khác nhau hoặc tùy ý

Giống như ví dụ đầu tiên, nhưng với hình ảnh đầu vào khác nhau về chiều rộng x chiều cao. Chúng sẽ được đệm để vừa trong hộp 1280x720:

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Xem các ví dụ trong Thay đổi kích thước video để vừa với trình phát có kích thước tĩnh nếu bạn muốn cắt (lấp đầy màn hình) thay vì pad (hộp thư / cột trụ) hoặc nếu bạn muốn ngăn chặn việc nâng cấp.

Đầu ra GIF

Thêm các bộ lọc từ Làm cách nào để chuyển đổi video thành GIF bằng ffmpeg, với chất lượng hợp lý?

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Sử dụng -looptùy chọn đầu ra để kiểm soát số lần các vòng lặp GIF. Mặc định là vòng lặp vô hạn nếu tùy chọn này không được sử dụng. Một giá trị -1là không có vòng lặp.

Tùy chọn và bộ lọc được sử dụng:

  • -t để đặt thời lượng tính bằng giây của mỗi đầu vào.

  • -loop 1 vòng lặp hình ảnh nếu không nó sẽ có thời lượng 1 khung hình.

  • -framerateđể đặt tốc độ khung hình ảnh đầu vào (mặc định khi không khai báo là 25). Hữu ích để làm GIF.

  • chia tỷ lệ với pad để khớp các hình ảnh đầu vào thành một kích thước đồng nhất, cụ thể (được sử dụng trong ví dụ # 3).

  • phai để mờ dần trong và ngoài. dlà thời gian mờ dần. stlà khi nó bắt đầu.

  • concat để nối (hoặc "tham gia") mỗi hình ảnh.

  • định dạng để xuất sơ đồ mẫu phụ sắc độ tương thích với các trình phát không dựa trên FFmpeg nếu xuất ra MP4 và mã hóa với libx264 (bộ mã hóa mặc định cho đầu ra MP4 nếu được bản dựng của bạn hỗ trợ).

  • tách để tạo bản sao của đầu ra bộ lọc. Cần bởi các bộ lọc bảng màu * để làm mọi thứ trong một lệnh.

  • palettegenpaletteuse để tạo GIF đẹp mắt.


Giao nhau

ví dụ crossfade

Ví dụ trong đó mỗi hình ảnh được hiển thị trong 5 giây và mỗi hình ảnh có độ dài kéo dài 1 giây. Mỗi đầu vào hình ảnh có cùng chiều rộng, chiều cao và tỷ lệ khung hình mẫu. Nếu chúng khác nhau về kích thước thì điều chỉnh ví dụ # 3 ở trên.

Đầu ra MP4

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4

Với âm thanh

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4

Kết hợp giữa hai video với âm thanh

Chọn 5 đoạn thứ hai từ mỗi đầu vào và thêm giao diện 1 giây:

ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[v0];
 [1:v]trim=start=12:end=17,setpts=PTS-STARTPTS+4/TB,format=yuva444p,fade=st=4:d=1:t=in:alpha=1[v1];
 [v0][v1]overlay,format=yuv420p[v];
 [0:a]atrim=start=5:end=10,asetpts=PTS-STARTPTS[a0];
 [1:a]atrim=start=12:end=17,asetpts=PTS-STARTPTS[a1];
 [a0][a1]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" output.mp4

Đầu ra GIF

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

Sử dụng -looptùy chọn đầu ra để kiểm soát số lần các vòng lặp GIF. Mặc định là vòng lặp vô hạn nếu tùy chọn này không được sử dụng. Một giá trị -1là không có vòng lặp.


1
@LordNeckbeard, cảm ơn vì câu trả lời này, tôi đã sử dụng nó cho một ví dụ khác. Tôi có hiểu rõ số đó theo sau -ttrong việc -loop 1 -t 1 -i 001.pngxác định thời lượng của các khung riêng lẻ không và các số theo sau T/trong filter_complexkhối xác định thời lượng của quá trình chuyển đổi? Và thời lượng khung trong ví dụ này có được tính bao gồm thời lượng của quá trình chuyển đổi hay không?
cincplug

1
@Nisarg Điều đó dường như không phải là đầu ra hoàn chỉnh và tôi không chắc đó là lệnh nào từ hai bạn đã hiển thị trước đó. Dù sao, hãy thử thêm -preset ultrafast.
llogan

1
@LordNeckbeard Tôi cần kết hợp một tập hợp hình ảnh, video clip và đoạn âm thanh để tạo một tệp video duy nhất (tốt nhất là ogg, nhưng điều đó ít liên quan hơn vào thời điểm này). Ngoài ra, tôi cần tạo một số hiệu ứng chuyển tiếp giữa các hình ảnh liền kề. Có cách nào để kịch bản toàn bộ tác vụ này bằng cách sử dụng ffmpeg và / hoặc các công cụ dòng lệnh khác không? Mục tiêu là tự động hóa tác vụ thông qua giao diện dòng lệnh.
Người dùng web

1
@WebUser Chuyển đổi có thể sẽ dễ dàng hơn bằng cách sử dụng melt.
khẩu hiệu

2
Cách tiếp cận ffmpeg đang làm việc tốt cho tôi; cảm ơn! Một lời khuyên cho những người mới đến trang; trong concat=n=9phần của lệnh, 9xuất phát từ 5 hình ảnh trong ví dụ + 4 chuyển tiếp giữa các hình ảnh. Nếu bạn đang xử lý một số lượng hình ảnh khác nhau, bạn sẽ cần điều chỉnh cho phù hợp.
Jim Miller

4

Tôi đã viết một tập lệnh bash chung có đường dẫn đến một thư mục hình ảnh và xuất ra một video crossfade với ffmpeg:

https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

Kịch bản về cơ bản nhìn vào các hình ảnh trong một thư mục và in ra một lệnh tương tự như câu trả lời của @LordNeckbeard ở trên và thực thi lệnh. Tập lệnh này giúp khi bạn có nhiều hình ảnh trong một thư mục và không muốn nhập thủ công một lệnh dài buồn.


Xin lỗi, nhưng tập lệnh của bạn không thành công với ffmpeg 3.0.1, với đầu vào # 0 đến # 4, nó trả về: "Chỉ mục tệp 5 không hợp lệ trong mô tả bộ lọc"
Krzysztof Bociurko

TobySpeight: điểm tốt, tôi đã chỉnh sửa câu trả lời để rõ ràng hơn. Về cơ bản, ý tưởng chính đã được đưa ra bởi @LordNeckbeard ở trên. Kịch bản này chỉ khái quát cho nhiều hình ảnh.
anh_ng8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.