길이를 알 수없는 비디오 / 오디오 클립을 페이드 인 / 아웃하는 방법은 무엇입니까?


19

ffmpeg를 사용하여 일부 비디오 파일을 일괄 변환하고 각 클립의 머리와 꼬리에 페이드 인 / 아웃 효과를 추가하는 프로젝트를 진행 중입니다.

이 코드를 사용하여 길이가 알려진 클립에 페이드 / 아웃 효과를 추가했습니다.

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

내 두 가지 질문은 다음과 같습니다

  1. 오디오를 동시에 페이드 인 / 아웃하는 방법은 무엇입니까?
  2. ffmpeg가 클립의 지속 시간을 자동으로 알아 내고 마지막 30 프레임을 페이드 아웃한다고 말할 수 있습니까?

감사!

답변:


15

# 1 오디오를 동시에 페이드 인 / 아웃하려면 :

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

afade 시간은 초 단위 입니다.

# 2 자동으로? 아니요. 아래 해결 방법을 참조하십시오.

먼저 ffprobe를 실행하여 지속 시간을 얻을 수 있습니다.

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

다음과 같은 것을 얻을 수 있습니다 :

video|13.556000
audio|13.816000

그런 다음 위의 내용을 사용하여 페이드를 배치 할 수 있습니다. 이 시간은 초입니다.

해결 방법

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에는 sseof끝에서 입력을 찾을 수 있는 옵션이 있습니다. 우리는 그것을 사용하여 목표를 달성 할 수 있습니다. 따라서 두 번째 시간은 마지막 초만 섭취하면서 입력을 두 번 공급합니다. 우리는 FFmpeg에게 타임 스탬프를 보존하도록 지시하여 ffmpeg는이 꼬리 부분의 시간적 위치를 보존합니다.

이 꼬리에 페이드 아웃을 적용한 다음 결과를 전체 입력에 오버레이합니다. 그것들은 동일한 미디어 파일이기 때문에, 전경은 배경을 완전히 덮고, copyts적용된 이후 , 배경 입력에서 대응하는 동일한 프레임에 오버레이가 발생합니다.

오디오의 경우 지속 시간이 2 초인 빈 더미 오디오를 만든 다음 기본 오디오에서이 더미 오디오로 오디오 크로스 페이드를 적용합니다. 두 번째 오디오는 비어 있으므로 사실상 주 입력의 페이드 아웃입니다. 은 -shortest크로스 페이드가 발생한 후에, 더미 오디오의 일부분을 남겨 추가된다.


"이러한 필터가 없습니다!"라는 오류가 발생합니다. 오디오 필터 용.
felwithe

1
4 개의 오디오 필터가 사용됩니다. 어느 것? -report추가 된 명령을 실행 하고 보고서를 공유하십시오.
Gyan

7

끔찍한 해킹이지만 오디오 페이드 인 / 아웃이지만 클립의 길이를 정확히 모르는 경우 작동합니다.

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

[편집 2019-07-24 :이 솔루션은 첫 번째 바이트를 스트리밍하기 전에 전체 트랙을 처리해야하므로 스트리밍 솔루션에는 적합하지 않습니다.]

다른 옵션은 acrossfade자동 트랙과 함께 사용하는 것 입니다.

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
이것은 실제로 꽤 우아하다 :-)
bk138

이것은 잘 작동합니다. 어떻게 작동하는지 설명해 주시겠습니까? 문서를 이해하려고 노력 ..
oberhamsi

1
@oberhamsi : 옵션 1 : 첫 번째 필터는 트랙 시작 부분에 페이드를 추가합니다. 그런 다음 오디오를 되돌리고 처음에 실제로 페이드 인을 추가합니다. 마지막으로 트랙이 다시 반전됩니다. 옵션 2는 0.6 초의 무음 트랙을 생성하고 원래 트랙과 동일한 시간 동안 크로스 페이드합니다. 모든 필터와 사용법은 여기에 설명되어 있습니다 : ffmpeg.org/ffmpeg-filters.html을 (나는 그것이 약간의 비밀이 있다고 동의해야하지만)
marekventur

3

질문 2에 대한 답은 그렇습니다. 동일한 기능을 찾고 있었고 페이드 지속 시간을 초 단위로 요청하고 페이드 아웃의 초기 프레임을 계산하는 bash 스크립트를 작성했습니다.

#!/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"

페이드에는 재 인코딩이 필요하므로 낮은 crf값을 libx264사용하면 고품질의 재 인코딩이 제공됩니다. 의견은 다른 모든 것을 설명해야합니다.


질문 2에 대한 답은 그렇습니다. -> 여전히 아니요입니다. Q is Can ffmpeg는 자동으로 기간을 알아냅니다 ... 그러나 여러 개의 ff * 명령을 실행하여 스크립트를 작성했습니다. 그러나 * nix 시스템에 유용합니다.
Gyan

나는 당신의 대답이 여전히 옳다고 주장합니까? 내 스크립트를 따르면, 와 함께 설치되어 실제로 automatically figure out the duration사용 ffprobe하고 있음을 알 수 ffmpeg있습니다. 명령 수에 대한 제한에 대해 누가 말했 *nix습니까? OP가 UNIX 버전을 사용하고있는 것 같습니다. 아니 .exe에서 ffmpeg명령. 나는 스스로 사용 OS X하고 UNIX있지만 사용하고 있지 않습니다 UNIX.
hmj6jmh

1
* 당신이 내 스크립트를 따르면, 당신은 실제로 자동으로 알아내는 것을 볼 수 있습니다 *-> 스크립트는, ffmpeg는하지 않습니다.
Gyan

그러나 배포판에 ffprobe없어서는 안될 부분입니다 ffmpeg. 얼굴 IMO를 절약하기 위해 니트를 선택하고 있습니다.
hmj6jmh

bash 스크립트에 의해 수행되는 작업이 ffmpeg에 의해 자동으로 수행되는 작업 이 아니라는 것에 동의해야합니다 . 그러나 이것이 효과가 있다면, 이것은 그 문제를 해결하는 방법입니다. 따라서 "해결 방법"이라는 용어가 사용됩니다. 나는 대부분의 사람들처럼 bash 나 유닉스 시스템이 없기 때문에 작동하는지 말할 수 없습니다. 어쨌든 노력에 +1.
ashleedawg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.