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.