Phiên bản TL; DR:
Ví dụ này chỉ thực hiện video, giả sử cả hai video clip có cùng độ phân giải, tốc độ khung hình, v.v ... Điều này sẽ tạo ra độ mờ 1 giây ở giữa fadeoutclip và fadeinclip. Giả sử rằng fadeoutclip dài 10 giây. Lưu ý rằng điều này được định dạng cho rõ ràng: nó thực sự là một dòng mã.
ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an \
-filter_complex "\
[0:v]trim=start=0:end=9,setpts=PTS-STARTPTS[firstclip]; \
[1:v]trim=start=1,setpts=PTS-STARTPTS[secondclip]; \
[0:v]trim=start=9:end=10,setpts=PTS-STARTPTS[fadeoutsrc]; \
[1:v]trim=start=0:end=1,setpts=PTS-STARTPTS[fadeinsrc]; \
[fadeinsrc]format=pix_fmts=yuva420p, \
fade=t=in:st=0:d=1:alpha=1[fadein]; \
[fadeoutsrc]format=pix_fmts=yuva420p, \
fade=t=out:st=0:d=1:alpha=1[fadeout]; \
[fadein]fifo[fadeinfifo]; \
[fadeout]fifo[fadeoutfifo]; \
[fadeoutfifo][fadeinfifo]overlay[crossfade]; \
[firstclip][crossfade][secondclip]concat=n=3[output] \
" \
-map "[output]" <add in encoding part here>
Phiên bản đầy đủ:
Dưới đây là một lời giải thích về những gì tất cả về:
Đặc điểm kỹ thuật đầu vào ... rõ ràng
ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an
Tạo một filter_complex
: giả sử bạn đã hiểu các phức bộ lọc:
-filter_complex
Đầu tiên, chúng tôi chia hai luồng thành hai phần bằng cách sử dụng bộ lọc trim : nội dung và phần mờ dần. Phần mờ dần được chia thành phần nội dung và phần mờ dần, trong khi phần mờ dần được cắt thành phần và phần mờ dần. Tổng cộng có bốn phần.
Lưu ý rằng nói đúng ra, chúng ta không cần phải loại bỏ các phần mờ dần: chúng ta chỉ cần xác định độ mờ dần và mờ dần theo thời gian cho hai video clip. Tuy nhiên, bằng cách này, chúng tôi:
- Thực hiện theo phương pháp thường được sử dụng bởi các trình chỉnh sửa video GUI
- Tránh sự phức tạp bực bội trong
overlay
cách sử dụng của bộ lọc
- Đảm bảo rằng giải pháp càng chung càng tốt (ví dụ mã có thể tái sử dụng)
- Cho phép chúng tôi xử lý trước và xử lý sau phần crossfade khi cần thiết (không được thực hiện ở đây)
Mỗi trong bốn phần này chỉ định: thời gian bắt đầu (giây), thời gian kết thúc (giây) và setpts=PTS-STARTPTS
bộ lọc bí ẩn , về cơ bản làm cho mỗi subclip video bắt đầu ở 0 giây. Điều này sẽ rất quan trọng khi kết hợp lại chúng.
Lưu ý rằng các s=0
chỉ định là dự phòng và setpts
bộ lọc cho các bộ lọc s=0
đó là dự phòng. Tuy nhiên, cả hai đều được chỉ định dự phòng để cho phép thời gian bắt đầu thay đổi từ 0, mà không phá vỡ phức tạp bộ lọc. Ngoài ra, clip nội dung thứ hai chạy đến cuối, vì vậy e=
phần (end =) không được chỉ định.
[0:v]trim=s=0:e=9,setpts=PTS-STARTPTS[firstclip];
[1:v]trim=s=1,setpts=PTS-STARTPTS[secondclip];
[0:v]trim=s=9:e=10,setpts=PTS-STARTPTS[fadeoutsrc];
[1:v]trim=s=0:e=1,setpts=PTS-STARTPTS[fadeinsrc];
Tiếp theo, chúng tôi chỉ định độ mờ dần và mờ dần: Trước tiên, chúng tôi thêm kênh alpha (độ trong suốt) vào cả hai phần mờ dần bằng cách chỉ định định dạng pixel củayuva420p
. Bạn thực sự có thể sử dụng bất kỳ định dạng nào cung cấp kênh alpha.
Tiếp theo trong bộ lọc con bộ lọc này, chúng tôi chỉ định một để làm mờ dần và một để làm mờ dần. Điều alpha=1
đó có nghĩa là bản thân video sẽ không bị tối, chỉ có lượng trong suốt sẽ "mờ dần". st
có nghĩa là bắt đầu, d
có nghĩa là thời gian.
[fadeinsrc]format=pix_fmts=yuva420p,
fade=t=in:st=0:d=1:alpha=1[fadein];
[fadeoutsrc]format=pix_fmts=yuva420p,
fade=t=out:st=0:d=1:alpha=1[fadeout];
Đây là gì?: Bộ fifo
lọc đảm bảo rằng có không gian bộ đệm có sẵn trong tổ hợp bộ lọc. Thật ngạc nhiên, đây KHÔNG phải là mặc định. Nếu bạn không làm điều này, crossfade có thể thất bại nếu đầu ra của giai đoạn trên vượt qua bộ lọc lớp phủ bên dưới. Vâng, tôi biết những gì bạn đang nghĩ ngay bây giờ. Đây thực sự là một lỗi FFMPEG .
[fadein]fifo[fadeinfifo];
[fadeout]fifo[fadeoutfifo];
Bây giờ, phủ hai phần mờ dần: Bằng cách đảm bảo hai phần xen kẽ có cùng kích thước, chúng tôi không phải lo lắng về các tùy chọn khá khó chịu mà bộ lọc lớp phủ thực hiện (và vì vậy chúng tôi bỏ qua chúng ở đây):
[fadeoutfifo][fadeinfifo]overlay[crossfade];
Cuối cùng, chúng tôi xếp hàng ba phân khúc của chúng tôi bằng bộ lọc concat .
[firstclip][crossfade][secondclip]concat=n=3[output]
Và bây giờ, ánh xạ bảng đầu ra là nguồn video của bạn.
KHÔNG GIỚI THIỆU để đặt định dạng pixel ĐẾN NHỮNG GÌ BẠN BỊ THƯỜNG SỬ DỤNG (thông thường yuv420p
), vì phần crossfade sẽ đặt nó yuv420
trên kênh đầu ra! (vì chúng tôi không chỉ định nó, bạn có thể sử dụng các đối số lớp phủ) Tất nhiên, nếu bạn MUỐN yuv420
, thì bạn vẫn ổn :-)
-map "[output]" <add your normal encoding part here>
Sau đó, bạn có thể kết hợp lại âm thanh sau (ngoài phạm vi của Hỏi & Đáp này)