Làm cách nào để làm mờ dần trong / ngoài một video clip / âm thanh với thời lượng không xác định?


19

Tôi đang làm việc trong một dự án mà tôi đang sử dụng ffmpeg để chuyển đổi hàng loạt một số tệp video và thêm hiệu ứng mờ dần vào / ra ở đầu và đuôi của mỗi clip.

Tôi đã sử dụng đoạn mã này để thêm hiệu ứng làm mờ / tắt trên các clip có thời lượng đã biết:

ffmpeg -i clip.mp4 -filter:v 'fade=in:0:30,fade=out:9650:30' -c:v libx264 -crf 22 -preset veryfast -c:a copy fadeInOut.mp4

Hai câu hỏi của tôi là:

  1. Làm thế nào tôi có thể đồng thời làm mờ dần âm thanh vào / ra?
  2. Ffmpeg có thể tự động tìm ra thời lượng của clip và được cho biết chỉ cần làm mờ dần 30 khung hình cuối cùng?

Cảm ơn!

Câu trả lời:


15

# 1 Để đồng thời làm mờ dần âm thanh vào / ra:

ffmpeg -i clip.mp4 -vf 'fade=in:0:30,fade=out:960:30'
                   -af 'afade=in:st=0:d=1,afade=out:st=32:d=1'
       -c:v libx264 -crf 22 -preset veryfast fadeInOut.mp4

Thời gian afade là trong vài giây .

# 2 Tự động? Không. Nhưng xem cách giải quyết dưới đây

Trước tiên bạn có thể chạy ffprobe để có thời lượng.

ffprobe -i clip.mp4 -show_entries stream=codec_type,duration -of compact=p=0:nk=1

Bạn sẽ nhận được một cái gì đó như thế này:

video|13.556000
audio|13.816000

Sau đó, bạn có thể sử dụng ở trên để đặt mờ dần. Những lần này là trong vài giây.

Cách giải quyết

ffmpeg -i clip.mp4 -sseof -1 -copyts -i clip.mp4 -filter_complex
       "[1]fade=out:0:30[t];[0][t]overlay,fade=in:0:30[v];
        anullsrc,atrim=0:2[at];[0][at]acrossfade=d=1,afade=d=1[a]"
       -map "[v]" -map "[a]" -c:v libx264 -crf 22 -preset veryfast -shortest fadeInOut.mp4

FFmpeg có một sseoftùy chọn cho phép một người tìm kiếm đầu vào từ cuối. Chúng ta có thể sử dụng điều đó để thực hiện mục tiêu của mình. Vì vậy, chúng tôi cung cấp đầu vào hai lần, với lần thứ hai chỉ ăn vào giây cuối cùng. Chúng tôi nói với FFmpeg để bảo vệ dấu thời gian, để ffmpeg duy trì vị trí tạm thời của phần đuôi này.

Chúng tôi áp dụng độ mờ dần cho đuôi này và sau đó phủ kết quả lên đầu vào đầy đủ. Vì chúng là cùng một tệp phương tiện, tiền cảnh hoàn toàn bao phủ nền và kể từ khi copytsđược áp dụng, lớp phủ xảy ra trên khung giống hệt tương ứng trong đầu vào nền.

Đối với âm thanh, chúng tôi tạo ra một âm thanh giả có thời lượng 2 giây và sau đó áp dụng một âm thanh chéo âm thanh từ âm thanh chính cho âm thanh giả này. Vì âm thanh thứ 2 trống, nên thực tế, đây là phần mờ dần cho đầu vào chính. Việc -shortestnày được thêm vào để loại bỏ các phần của âm thanh giả sau khi xảy ra giao thoa.


Điều này đưa ra lỗi "không có bộ lọc như vậy!" cho bộ lọc âm thanh.
felwithe

1
Có 4 bộ lọc âm thanh được sử dụng. Cái nào? Chạy lệnh của bạn với -reportthêm và chia sẻ báo cáo.
Gyan

7

Đây là một vụ hack khủng khiếp, nhưng điều này có thể hoạt động nếu tất cả những gì bạn muốn làm là âm thanh mờ dần vào / ra nhưng không biết chính xác đoạn clip dài bao nhiêu:

ffmpeg -i input.mp4 -filter_complex "afade=d=0.5, areverse, afade=d=0.5, areverse" output.mp4

[chỉnh sửa 2019-07-24: Lưu ý rằng giải pháp này không tốt cho các giải pháp phát trực tuyến vì nó yêu cầu toàn bộ bản nhạc được xử lý trước khi byte đầu tiên có thể được phát trực tuyến]

một tùy chọn khác tôi sử dụng acrossfadevới một bản nhạc im lặng:

ffmpeg -i input.mp4 -filter_complex "aevalsrc=0:d=0.6 [a_silence]; [0:a:0] [a_silence] acrossfade=d=0.6" output.mp4

3
Điều này thực sự khá thanh lịch :-)
bk138

công việc này thật tuyệt bạn có thể giải thích làm thế nào nó hoạt động. cố gắng hiểu ý nghĩa của tài liệu ..
oberhamsi

1
@oberhamsi: Tùy chọn 1: Bộ lọc đầu tiên thêm phần mờ dần ở đầu bản nhạc. Sau đó, nó đảo ngược âm thanh và thêm một sự mờ dần ở đầu (mà thực sự là kết thúc). Cuối cùng, bản nhạc được đảo ngược một lần nữa. Tùy chọn 2 tạo ra một bản nhạc im lặng 0,6 giây và xen kẽ nó trong cùng một khoảng thời gian với bản nhạc gốc. Tất cả các bộ lọc và cách sử dụng của chúng được ghi lại ở đây: ffmpeg.org/ffmpeg-filters.html (mặc dù tôi phải đồng ý rằng đó là một chút khó hiểu)
marekventur

3

Câu trả lời cho câu hỏi 2 là CÓ! Tôi đã tìm kiếm chức năng tương tự và cuối cùng tôi đã viết một tập lệnh bash yêu cầu thời lượng mờ dần trong vài giây và tính toán khung hình ban đầu cho độ mờ dần:

#!/bin/bash

f="$*" # all args
p="${f##*/}" # file
fn="${p%.*}" # name only
e="${p##*.}" # extension

echo
echo $f
echo $p
echo $fn
echo $e
echo

read -e -p "Number of seconds of fade-out: " -i 1 sec # prompt for fade duration in seconds

r=$(ffprobe -show_streams "$f" 2> /dev/null | grep r_frame_rate | head -1 | cut -d \= -f 2) # frame rate
let "frames = $r * $sec" # duration of fade as number of frames
echo $r
echo $sec
echo $frames
lf=$(ffprobe -show_streams "$f" 2> /dev/null | grep nb_frames | head -1 | cut -d \= -f 2) # total number of frames
let "lf = $lf - $frames" # initial frame to start fade at

ffmpeg -loglevel quiet -i "$f" -vf fade=out:$lf:$frames -r $r -vcodec libx264 -preset slow -crf 12 -bf 2 -flags +cgop -pix_fmt yuv420p -acodec copy "$fn $sec sec fade-out.$e"
open "$fn $sec sec fade-out.$e"

Fades yêu cầu mã hóa lại để sử dụng crfgiá trị thấp để libx264mã hóa lại chất lượng cao. Các ý kiến ​​nên giải thích mọi thứ khác.


Câu trả lời cho câu hỏi 2 là CÓ! -> vẫn là Không. Q là ffmpeg có thể tự động tìm ra thời lượng ... nhưng bạn đã viết một tập lệnh chạy nhiều lệnh ff * để thực hiện. Hữu ích cho các hệ thống * nix, mặc dù.
Gyan

Tôi hiểu rồi, vậy bạn có nhấn mạnh rằng câu trả lời của BẠN VẪN đúng không? Nếu bạn làm theo kịch bản của tôi, bạn sẽ thấy rằng nó thực sự automatically figure out the durationsử dụng ffprobe, được cài đặt với ffmpeg. Ai nói bất cứ điều gì về bất kỳ hạn chế về số lượng lệnh hoặc *nix? Có vẻ như OP đang sử dụng một phiên bản UNIX. Không có .exetrong ffmpeglệnh. Bản thân tôi đang sử dụng OS Xđược xây dựng trên UNIXnhưng không UNIX.
hmj6jmh

1
* Nếu bạn theo dõi tập lệnh của tôi, bạn sẽ thấy rằng nó thực sự tự động tìm ra * -> tập lệnh của bạn có, ffmpeg thì không.
Gyan

Nhưng ffprobelà một phần không thể thiếu của ffmpegphân phối. Bạn đang chọn tại nits để giữ thể diện IMO.
hmj6jmh

Tôi phải đồng ý rằng một cái gì đó được thực hiện bởi một tập lệnh bash không phải là thứ được ffmpeg tự động thực hiện. Nhưng nếu điều này hoạt động, đây là một cách để giải quyết vấn đề đó. Do đó, thuật ngữ "cách giải quyết". Tôi không thể nói nếu nó hoạt động bởi vì tôi, giống như hầu hết mọi người ngoài kia, không có bash hoặc hệ thống unix. +1 cho những nỗ lực dù sao đi nữa.
ashleedawg
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.