ffmpeg 명령 줄에서 ffmpeg를 사용하여 두 개의 mp4 파일 결합


29

다음 명령을 사용하여 여러 파일을 성공적으로 결합 할 수 있습니다.

ffmpeg -f concat -i input.txt -codec copy output.mp4

이 명령의 유일한 문제점 은 다음 내용으로 input.txt 라는 텍스트 파일에서 파일 경로를 읽어야한다는 것입니다 .

file 'C:\Users\fabio\Downloads\Super\Sharks\01.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\02.mp4'
file 'C:\Users\fabio\Downloads\Super\Sharks\03.mp4'

파일에서 파일 경로를 읽을 필요없이 동일한 목표를 달성 할 수있는 방법이 있습니까? 나는 운없이 다음을 시도했다.

ffmpeg -f concat -i file "C:\a\b\01.mp4" file "C:\a\b\02.mp4" -codec copy output.mp4
ffmpeg -f concat -i "C:\a\b\01.mp4" "C:\a\b\02.mp4" -codec copy output.mp4

다른 명령을 사용해야합니까?


답변:


37

2019 년 업데이트 :

주석에서 언급했듯이 Stack Overflow에는 사용 가능한 연결 옵션에 대한 훌륭한 설명과 사용하는 파일 유형에 따라 사용할 방법에 대한 설명이 있습니다.

FFmpeg를 사용하여 두 개의 MP4 파일을 연결하는 방법은 무엇입니까?

원래 2016 답변 :

concat 프로토콜 방법을 사용하여 파일을 결합 할 수 있어야 합니다.

ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy output.mp4

또한 FFmpeg 매뉴얼에서는 손실없이 연결하기 위해 MP4 파일을위한 방법에 대해 설명하지만 임시 파일 (또는 명명 된 파이프)을 작성해야합니다.

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

1
첫 번째 명령은 버터처럼 나를 위해 일했습니다 .. 6 mp4 파일을 출력 파일로 연결하는 데 2 ​​~ 3 초가 걸렸습니다 (약 239MB).
— Sachin

22
첫 번째 명령은 나를 위해 작동하지 않았습니다. 방금 첫 번째 파일을 복사했습니다.
— Luis A. Florit 2012 년

3
이것은 작동하지 않으며 첫 번째 파일을에 복사했습니다 output.mp4.
— crmpicco

2
MP4에서는 파일 수준 연결이 작동하지 않으므로이 형식에는 연결 프로토콜이 권장되지 않으며 일반적으로 작동하지 않습니다.
— 슬로건

1
@brasofilo 링크 감사합니다. 이것은 기한이 지났지 만 사람들을 그 방향으로 향하도록 대답을 업데이트했습니다.
— 카슨 달링

5

ffmpeg로리 스트를 출력하고리스트를 stdout읽어 파일을리스트로 대체 할 수 있습니다 stdin.

(echo file 'a.mp4' & echo file 'b.mp4') | ffmpeg -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -vcodec copy -acodec copy "result.mp4"

Mac OS 10.12.6에서 ffmpeg 버전 2.4.3-tessus를 사용하면 "인식 할 수없는 옵션 'protocol_whitelist'"오류가 발생합니다. protocol_whitelist 옵션이 없으면 두 번째 MP4 파일의 복사본을 만드는 것 같습니다.
— 제임스

2

아니요, 해킹없이 단일 명령 줄에서 ffmpeg concat demuxer를 사용할 수있는 방법이 없습니다. 파일 목록으로 입력 텍스트 파일을 작성해야합니다. 나는 이것이 이상하다고 생각했다. 어쩌면 누군가가 나중에 FFMpeg에 이것을 추가 할 것이다.

이 질문에 대한 대답은 OP가 요청한 concat demuxer가 아닌 concat 프로토콜을 사용합니다.


1
실제로 있습니다. stdin.
— Qwertiy

concat 프로토콜은 MP4 또는 글로벌 헤더가 필요한 다른 형식과 함께 사용해서는 안됩니다.
— 구호

1

명령을 변경하지 않고도 스크립트에서 계속 수행 할 수 있습니다. 다음과 같은 것 :

echo "file fname1" >$$.tmp    #single redirect creates or truncates file
echo "file fname2" >>$$.tmp   # double redirect appends
echo "file fname3" >>$$.tmp   # do as many as you want.

ffmpeg -f concat -i $$.tmp -codec copy output.mp4

rm $$.tmp  # just to clean up the temp file. 
           # For debugging, I usually leave this out.

$$는 명령을 실행하는 쉘의 pid로 확장되므로 파일 이름은 실행할 때마다 다릅니다. 원하는 경우 $$. txt를 사용할 수 있습니다. 또는 다른 것...

또한 여기 파일을 사용하여 파일에 많은 데이터를 추가 할 수 있습니다.

cat <<EOF >$$.tmp
file fname1
file fname2
file fname3
EOF

bash 변수 대체가 작동하므로 파일의 내용을 프로그래밍 방식으로 결정할 수 있으므로 수정하지 않아도됩니다. 이런 종류의 것들을 항상 for 루프에 포함시킵니다. 마지막으로 리디렉션은 위와 동일하게 작동하므로 >> $$. tmp가 잘리고 >> $$. tmp가 추가됩니다.


2
질문은 "파일에서 파일 경로를 읽을 필요없이 동일한 목표를 달성 할 수있는 방법이 있습니까?" 파일 경로를 파일에 기록하는 방법을 제공하기 만하면됩니다 (파일에서 파일 경로를 읽기 전에). 이것은 질문에 대답하지 않습니다.
— Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.