xen kẽ giữa 2 video bằng ffmpeg


27

Tôi đã cố gắng đạt được chuyển đổi chéo giữa 2 video clip bằng ffmpeg nhưng cho đến nay đã thất bại. Tôi mới sử dụng ffmpeg và chủ yếu dựa vào điều chỉnh những gì tôi có thể tìm thấy trong tài liệu và các ví dụ hiện có trực tuyến. Từ những gì tôi đọc được cho đến nay, sử dụng bộ lọc pha trộn hoặc lớp phủ sẽ giúp đạt được những gì tôi đang theo đuổi nhưng tôi không thể tìm ra chi tiết dòng lệnh để làm cho nó hoạt động.

Các bộ lọc làm mờ và concat rất tốt để làm mờ dần video 1, làm mờ dần sang video 2 và ghép các chuyển đổi loại clip 2 thành 1 nhưng tôi đánh giá cao sự trợ giúp trong việc chuyển lệnh từ video 1 sang video 2 mà không cần bất kỳ đi đến màu đen ở giữa. Tôi không thể tìm thấy bất kỳ ví dụ nào cho chính xác vấn đề này ở bất cứ đâu, có lẽ tôi đang tìm từ khóa sai ...?

Cụ thể hơn, video của tôi là mp4 (video h264, không có âm thanh, trong trường hợp có vấn đề), mỗi video dài 5 giây và tôi sau khi chuyển từ khoảng. 4,5 giây của video 1 đến 0,5 giây của video 2.

Tương tự như những gì hướng dẫn này sử dụng MLT và khung (xem 2:25 để làm mờ ví dụ), mặc dù tôi đang tìm cách để làm điều này chỉ trong ffmpeg mà không cần gọi bất kỳ pross nào khác. http://www.youtube.com/watch?v=3PRZ9L_KLdI

Bất kỳ con trỏ hoặc có thể một dòng lệnh để có được một mờ dần như thế này sẽ được nhiều đánh giá cao, cảm ơn rất nhiều!


Câu trả lời:


23

Tôi đề nghị làm theo cách đó:

  • Tạo nền đen với cùng thời lượng và độ phân giải như video đầu ra phải là
  • Thêm kênh alpha vào mỗi video
  • Thêm hiệu ứng làm mờ dần cho mỗi video
  • Sử dụng lớp phủ trên mỗi video với nền đen

Vì vậy, lệnh để thêm crossfade vào 2 video (5 giây) phải là:

ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4

Điều này sẽ làm mờ video đầu tiên thành alpha ở giây thứ 4 (st = 4) trong 1 giây (d = 1), mờ dần ở video thứ hai ở 0 giây (st = 0) trong 1 giây (d = 1) và di chuyển màn hình của nó thời gian chuyển tiếp lên 4 giây (+ 4 / TB). Sau đó, chúng tôi chỉ cần cắt 9 giây màu đen, thu nhỏ nó để xuất kích thước video và phủ lên các thứ.

Hy vọng nó giúp.


Xin chào @ptQa, cảm ơn rất nhiều, hiệu ứng crossfade hoạt động như một lá bùa. Mặc dù điều xảy ra trong video đầu ra là nó chỉ hiển thị phần trên cùng bên trái của video gốc và phần còn lại của khung bị thiếu. Tôi đã xem độ phân giải, đầu vào là 960 x 720 và đầu ra là 320 x 240 nhưng nó không thu nhỏ toàn bộ video, thay vào đó cắt ra một phần 320 x 240 ở phía trên bên trái và hiển thị rằng trong video đầu ra, phần còn lại của các video đầu vào bị thiếu. Có một bổ sung cho dòng lệnh của bạn ngăn chặn điều này?
Mugba

Ồ, tôi hiểu rồi, bạn cũng nên chia tỷ lệ màu đen thành độ phân giải mà bạn muốn nhận. Xem câu trả lời cập nhật. Tôi đã thêm tỷ lệ để lọc đồ thị.
ptQa

Điều đó đã giải quyết nó, cảm ơn. Tôi đã tải lên một video mẫu cho thấy sự
xen kẽ

Vấn đề tương tự; Tôi có một biến thể của điều này làm việc trên một số video của riêng tôi - cảm ơn. Câu hỏi: Làm thế nào điều này sẽ được sửa đổi để làm mờ dần các rãnh âm thanh của video, theo cùng một mẫu với video mờ dần?
Jim Miller

1
BTW, tôi nghĩ rằng có một lỗi trong lệnh mẫu của câu trả lời - nó phải vậy -i 1.mp4 -i 2.mp4..., phải không?
Jim Miller

6

Đây là cách tôi đã làm:

  • phiên bản ffmpeg N-77197-gdf2ce13
  • 2 video mỗi video 4 giây.
  • Cần tham gia với sự mờ dần giữa chúng.
  • video là 25 khung hình / giây.

1) Thêm fade out (sáng đến tối) vào cuối ngày 1 và mờ dần (tối sang sáng) khi cầu xin thứ 2:

ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4

ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4

76:24 có nghĩa là fade out sẽ bắt đầu khung 76 và sẽ hoàn thành 24 khung hình sau = 1s mờ dần.

0:25 có nghĩa là fade in sẽ bắt đầu khung 0 và sẽ kết thúc 25 khung hình sau.

2) Hợp nhất 2 video

Chuyển đổi tất cả sang TS

ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts

ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts

Hợp nhất

ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4

Nhờ vào:

http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade thừng_transitions_effects_filters.php


5
Đây không phải là một crossfade.
Gyan

4
Những gì @Mulvya nói. Một crossfade làm mờ dần một clip cùng lúc với một clip khác đang mờ dần. Clip đầu tiên có độ trong suốt của nó tăng đều đặn trong suốt thời gian của crossfade; thứ hai có độ trong suốt giảm dần.
trực giác

6

ffmpeg-concat là cách dễ nhất để thực hiện những gì bạn muốn và cho phép bạn sử dụng một loạt các chuyển đổi OpenGL gợi cảm, với mặc định là crossfade.

chuyển đổi ffmpeg-gl là một bộ lọc ffmpeg tùy chỉnh cho phép bạn sử dụng GLSL để chuyển tiếp suôn sẻ giữa hai luồng video. Bộ lọc này dễ sử dụng và tùy chỉnh hơn đáng kể so với các lựa chọn thay thế được liệt kê ở đây.

Bộ lọc này hỗ trợ một danh sách lớn các loại chuyển đổi, với mặc định là crossfade.

./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4

4
Bạn đã xem xét việc gửi một bản vá cho FFmpeg?
llogan

1
Tôi chắc chắn sẽ, tôi chỉ cần sửa một số vấn đề nhỏ và kiểm tra thêm trước. Cuộc gọi tốt
fisch2

Đây có phải là trong FFmpeg chính thức? Tôi dường như không thể xác định vị trí của nó
kraftydevil
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.