ffmpeg 오디오를 추가하지만 비디오 길이는 동일하게 유지 (가장 짧지 않음)


12

ffmpeg를 사용하여 비디오 파일에 오디오를 추가하고 있습니다.

ffmpeg -i videofile.mp4 -i audiofile.wav output.mp4

그러나이 방법은 출력 비디오 파일이 비디오보다 긴 경우 오디오 파일의 길이가되도록 확장합니다. 오디오 파일이 비디오보다 짧은 경우 -shortest를 사용하면 비디오 파일이 짧아집니다. ffmpeg에게 출력 비디오의 길이를 입력 비디오의 길이로 유지하도록 지시하는 플래그가 있습니까?


정답을 선택하십시오. 유일한 올바른 것은 @Zurechtweiser의 것입니다.
Roel Van de Paar

답변:


13

비디오가 더 길면 -filter_complex 옵션과 apad 필터 옵션을 사용하여 마지막에 침묵으로 오디오를 제거하여 원하는 목표를 달성 할 수 있다고 생각합니다. 당신의 명령은 다음과 같습니다.

ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -shortest output.mp4

이것은 원하는 오디오가 audiofile.wav의 첫 번째 스트림에 있다고 가정하고 [A : B] 구문은 A 번째 입력에서 B 번째 스트림을 가져 오라고 말합니다 (둘 다 0으로 시작하므로 [1 : 0]은 두 번째 입력의 첫 번째 스트림 또는 위의 audiofile.wav).

세부 정보 : https://www.ffmpeg.org/ffmpeg-filters.html#Examples-68


당신은 것을 언급해야 -filter_complex옵션 세력이 재 인코딩 - 그것을 실행할 수 예되어 ffmpeg -i videofile.mp4 -i audiofile.wav -c:v copy output.mp4있지만ffmpeg -i videofile.mp4 -i audiofile.wav -filter_complex " [1:0] apad " -c:v copy -shortest output.mp4
오이겐 RIECK

이것은 요청 된 것과 정 반대입니다. OP는 오디오가 종료되면 비디오를 종료하도록 요청합니다. 오디오가 비디오보다 짧으면 오디오 침묵을 추가하는 것이 제공됩니다. 이 답변은 잘못되었습니다.
Roel Van de Paar

OP가 요청한 것과 반대되는 것은 아니다. OP는 오디오 트랙의 길이에 관계없이 출력 비디오가 입력 비디오의 길이가되기를 원합니다. 내 대답은 입력 비디오가 오디오 파일보다 긴 상황을 해결합니다. OP에는 입력 비디오가 오디오 파일보다 짧은 경우 -shortest를 사용하는 솔루션이 이미 있습니다.
deadcode

12
  • 비디오 길이가 오디오 길이보다 짧은 경우 -shortest원하는 것입니다.
  • 비디오 길이가 오디오 길이보다 길면 원하는 플래그가 전혀 없습니다.

이 결정을 자동화 할 플래그가 없습니다.

편집하다

@deadcode의 답변에서 영감을 얻어, 다시 자동화 할 의향이 있다면 "자동화 할 플래그 없음"은 물론 사실 이 apad아니라는 것을 분명히해야합니다.

그러나 재 인코딩을 피하려면 (즉 -c:v copy) 답이 의미합니다.

ffconcat디먹 서를 사용하는 해결 방법이 있지만 약간의 작업이 필요합니다.

  • 오디오 파일과 정확히 같은 형식 으로 무음이 포함 된 파일을 만듭니다 ( "silence.wav")
  • concat 파일 "audio.ffconcat"를 작성하십시오 (오디오 길이가 길어야하는 묵음 라인 수).

.

file 'audiofile.wav'
file 'silence.wav'
file 'silence.wav'
...
file 'silence.wav'
  • 운영 ffmpeg -i videofile.mp4 -f concat -i audio.ffconcat -c:v copy output.mp4

apad필터 그래프없이 필터를 합성하여 재 인코딩없이 mux를 허용합니다.


@RoelVandePaar 내가 말한 것처럼 : 비디오 길이가 오디오 길이보다 짧으면 -shortest재 인코딩없이 침묵을 추가하려면이 해결 방법을 사용하십시오.
Eugen Rieck

맞아요, 리뷰를 놓쳤습니다. 입력을 제거했습니다. 자유롭게하세요.
Roel Van de Paar

6

비디오 파일의 길이를 알고 있다면 다음을 사용하여 달성 할 수 있습니다.

ffmpeg -i videofile.mp4 -i audiofile.wav -t 43 output.mp4

여기서 43은 비디오 파일의 길이 (초)입니다.


저자 질문은 비디오가 끝나지 않은 상태에서 오디오 파일을 반복하려고합니다. 이것이 효과가 있습니까?
Rafael Sanches

@RafaelSanches 아니, 그는하지 않습니다.
Zurechtweiser

저자는 오디오를 반복하고 싶지 않습니다. 이 답변은 OP가 요청한 것을 수행하는 유일한 올바른 답변입니다. 입력 비디오가 끝나면 비디오를 종료합니다.
Roel Van de Paar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.