추가 파일없이 단일 명령을 사용하여 여러 WAV 파일을 연결


32

FFMPEG를 사용하여 여러 WAV 파일을 단일 WAV 파일로 연결하고 싶습니다.

다음 명령을 사용했으며 필요한 파일을 생성합니다.

명령:

ffmpeg -f concat -i mylist.txt -c copy output.wav

파일 :

#mylist.txt
file '1.wav'
file '2.wav'
file '3.wav'
file '4.wav'

그러나 당신이 볼 수 있듯이 문제는 연결할 WAV 파일 목록을 지정하기 위해 텍스트 파일을 만들어야한다는 것입니다.

이 모든 작업을 수행 할 수 있지만 다음과 같은 단일 명령을 선호합니다.

ffmpeg -i 1.wav -i 2.wav -i 3.wav -i 4.wav output.wav 

또는

ffmpeg -i "concat:1.wav|2.wav|3.wav|4.wav" -c copy output.wav

이 두 가지 간단한 명령을 시도했지만 음성 만 반환 1.wav 원하는 결과를 달성하는 단일 명령을 작성하거나 위의 두 명령을 수정하십시오.

다른 미디어 인코더 / 편집기를 제안하지 마십시오. FFMPEG는 이미 설치되어 있고 다른 곳에 사용되기 때문에 FFMPEG 만 사용하고 싶습니다.

답변:


34

concat 필터를 사용해 볼 수 있습니다 . 다시 인코딩해야하므로 더 많은 시스템 리소스 (이 경우 모호한 최신 컴퓨터에서는 아주 적은 양)가 필요하지만 PCM-> PCM 오디오는 수학적으로 손실이 없어야합니다. 귀하의 경우 다음과 같은 것을 사용합니다.

ffmpeg -i input1.wav -i input2.wav -i input3.wav -i input4.wav \
-filter_complex '[0:0][1:0][2:0][3:0]concat=n=4:v=0:a=1[out]' \
-map '[out]' output.wav

5 개의 입력 파일이 있으면를 사용하십시오 n=5.


4
참고 : [0:0][1:0][2:0][3:0]파일 수와 일치하도록 사용자 정의하지 마십시오 . 그것이 말하는 그대로 사용하십시오. 변경해야하는 것은 입력 파일과 n=4입니다.
Keavon

8
@Keavon : 확실합니까? 여기서 ffmpeg (버전 N-49352-gc46943e x64) Too many inputs specified for the "concat" filter.는 원래 코드로 2 개의 입력 만 처리하려고하면 불평 합니다. 그것은 제거 할 때 작동하지만 [2:0][3:0]...이 경우 스트림 2:0과 같은 것들이 없기 때문에 나에게 의미가 있습니다 3:0...
Bigue Nique

@BigueNique에 동의합니다. 나도 같은 오류가 발생하여 약간 어리석은 느낌이 들지만 주어진 적절한 시퀀스를 생성하는 코드를 작성했습니다 n.
Ryan DuVal

19

가장 좋은 옵션은 ffmpeg가 아닌 sox를 ​​사용하는 것입니다.

$ sox short1.wav short2.wav short3.wav long.wav

해결책은 숫자 순서 (0이 아닌)를 유지하면서 .wav 파일을 어떻게 추가합니까?


1
이것은 효과가있을 수 .wav있지만 sox지원하지 않는 것 같습니다 .mp3.
Aaron Franke

1
질문은 정확하게에 관하여이었다.wav
헥터 M. Monacci

1
나는이 방법을 wav가 아닌 파일로 사용하려고하는 사람을 위해 메모를 추가하고 있습니다.
Aaron Franke

이 질문은 ffmpeg 만 사용하여 솔루션이 필요하다고 명시 적으로 언급했습니다!
Manu

sox도 .mp3 파일을 지원할 수 있습니다
Benjamin

9

언급한다 위키는 FFmpeg 은 Using concat프로토콜은 모든 파일 형식으로 수 없습니다. 그것은 대부분의 MPEG 컨테이너 및 비트 스트림에서 잘 작동하지만 PCM 오디오가있는 WAV 파일은 아닙니다.

반드시 임시 파일을 작성하여 사용할 필요는 없습니다. Bash (또는 프로세스 대체 를 지원 하는 다른 쉘 )를 사용하면 단일 명령으로 모든 것을 수행 할 수 있습니다.

ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) output.wav

프로세스 대체 는 읽을 수 <( )있는 파일 즉, 파일 디스크립터를 즉석에서 ffmpeg작성합니다. 이 파일에는 .wav현재 디렉토리의 모든 파일에 대한 경로가 포함됩니다 . $(pwd)파일 디스크립터가 아닌 현재 디렉토리에 대한 올바른 경로를 얻으려면 접두사를 붙여야합니다 .

물론, 대체 내의 명령은 다른 것으로 변경 될 수 있습니다.


2
당신이 얻을 경우 Unsafe file name오류를 당신이 필요 -safe 0하기 전에 옵션을 -i. 심판. stackoverflow.com/q/38996925/297679
Nobu

3

다른 옵션은 concat 을 사용하는 것입니다

ffmpeg -i "concat : file1.mp3 | file2.mp3 | file3.mp3"-acodec copy out.mp3


1
수퍼 유저에 오신 것을 환영합니다. 질문에 대답 할 수도 있고 대답하지 않을 수도 있지만 (답변이 수락 됨) 솔루션이 세부적으로 작동하는 이유와 지침을 따르기 쉬운 이유를 설명 할 수 있으면 더 나은 답변이 될 것입니다. 당신이 당신의 대답이 옳다고 생각되면 다음을 수행하고 다시 편집하십시오. 몇 분을 가지고 읽어 보시기 바랍니다 : - superuser.com/help .Answering : superuser.com/help/how-to-answer을 다시 환영 superuser.Thankyou에
mic84

나는 이것을 테스트
Nick Long

1

Win8의 Cmd.EXE .BAT 스크립트에서 :

Rem Get number of source files
For /F %%A In ('Dir *.3gp /B /A-D ^| Find /C /V ""') Do      Set FilCnt=%%A

Rem Build list of source filenames
Set Lst=
For    %%A In (     *.3gp                          ) Do Call Set Lst=%%Lst%% -i %%A

Rem Concat and Convert sources to target
FFMPeg.EXE %Lst% -filter_complex concat=n=%FilCnt%:v=0:a=1 -vn Output.OGG

이런 식으로 소스 파일 이름이나 concat-count 매개 변수를 사용하지 않아도됩니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.