Một cách hiệu quả để thực hiện một video chéo với FFmpeg là gì?


11

Thực hiện xen kẽ giữa hai phần nội dung video thực sự khá phức tạp trong FFmpeg. Không có bộ lọc crossfade nào giống như có cho âm thanh.

Cách hiệu quả để làm điều đó là gì?


Câu hỏi tự trả lời tốt đẹp!
JakeGould

Câu trả lời này cần nhận được rất nhiều lượt nâng cấp ... Đánh dấu, tôi sẽ yêu bạn mãi mãi nếu bạn thêm mờ dần cho âm thanh ...
Merc

Ngay sau khi tôi tìm ra cách, tôi sẽ thêm nó. Tôi nghĩ rằng âm thanh chéo là snap, tho ', tin rằng có một bộ lọc đơn giản cho nó.
Mark Gerolimatos

Tôi chỉ cần thêm vào [0:a][1:a] acrossfade=d=1 [audio]bộ lọc và sau đó -map "[audio]" vào lệnh và nó đã hoạt động. Nếu bạn thích, hãy cho nó một bài kiểm tra và cập nhật câu trả lời!
Merc

Câu trả lời:


17

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 overlaycá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-STARTPTSbộ 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=0chỉ định là dự phòng và setptsbộ 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". stcó nghĩa là bắt đầu, dcó 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ộ fifolọ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ó yuv420trê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)


1
Trong ffmpeg mới nhất, nó cần phải trim=start=0:end=9, (chứ không phải trim=st=0:e=9,..
Merc

Nhưng nghiêm túc mà nói, đây sẽ là câu trả lời hay nhất trên FFMPEG mà tôi từng thấy, và lời giải thích rõ ràng nhất từ ​​trước đến nay.
Merc

Man, điều đó sẽ đi vào đầu tôi :-) Cảm ơn các đạo cụ !!!!
Mark Gerolimatos

Đừng lo lắng. Vui lòng cập nhật câu trả lời đặc biệt với = trim = start = 0 vì hiện tại nó không hoạt động với ffmpeg mới nhất
Merc

Phiên bản ffmpeg mới nhất cho tôi lỗi này: Filter setpts has an unconnected outputđối với tập lệnh. Tôi đã thay đổi các tham số trim để bắt đầu và kết thúc.
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.