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

ffmpeg를 사용하여 두 개의 mp4 파일을 연결하려고합니다. 나는 이것이 자동 프로세스이기 때문에 ffmpeg를 선택한 이유입니다. 두 파일을 .ts 파일로 변환 한 다음 연결 한 다음 연결된 .ts 파일을 인코딩하려고합니다. 파일은 h264 및 aac로 인코딩되어 있으며 가능한 한 품질을 동일하게 유지하거나 원본과 가깝게 유지하고 싶습니다.

ffmpeg -i part1.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part1.ts
ffmpeg -i part2.mp4 -vcodec copy -vbsf h264_mp4toannexb -acodec copy part2.ts
cat part1.ts part2.ts > parts.ts
ffmpeg -y -i parts.ts -acodec copy -ar 44100 -ab 96k -coder ac -vbsf h264_mp4toannexb parts.mp4

불행히도 인코딩 중에 ffmpeg에서 다음과 같은 오류 메시지가 나타납니다.

[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[h264 @ 0x1012600]sps_id out of range
[h264 @ 0x1012600]non-existing SPS 0 referenced in buffering period
[NULL @ 0x101d600]error, non monotone timestamps 13779431 >= 13779431kbits/s
av_interleaved_write_frame(): Error while opening file

이것은 인코딩의 절반 정도 발생하여 두 개의 .ts 파일을 함께 연결할 수 없으며 작동한다고 생각합니다.



답변

FFmpeg에는 세 가지 연결 방법이 있습니다.

1. 연결 비디오 필터

입력에 동일한 매개 변수 (너비, 높이 등)가 없거나 형식 / 코덱이 같지 않거나 필터링을 수행하려는 경우이 방법을 사용하십시오. (일치하지 않는 입력 만 다시 인코딩하여 동일한 코덱과 다른 매개 변수를 공유 한 다음 concat demuxer를 사용하여 다른 입력을 다시 인코딩하지 않도록 할 수 있습니다).

ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv \
       -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] 
                        concat=n=3:v=1:a=1 [v] [a]" \
       -map "[v]" -map "[a]" output.mkv

이 방법은 재 인코딩을 수행합니다.

2. concat demuxer

재 인코딩을 피하고 형식이 파일 레벨 연결을 지원하지 않는 경우 (일반 사용자가 사용하는 대부분의 파일은 파일 레벨 연결을 지원하지 않는 경우)이 방법을 사용하십시오.

$ cat mylist.txt
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

$ ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4

Windows의 경우 :

(echo file 'first file.mp4' & echo file 'second file.mp4' )>list.txt
ffmpeg -safe 0 -f concat -i list.txt -c copy output.mp4

3. 연결 프로토콜

파일 수준 연결을 지원하는 형식 (MPEG-1, MPEG-2 PS, DV)과 함께이 방법을 사용하십시오. 마십시오 하지 MP4로 사용합니다.

ffmpeg -i "concat:input1|input2" -codec copy output.mkv

이 방법은 이러한 형식의 특성과이 방법으로 수행되는 단순한 연결로 인해 MP4를 포함한 많은 형식에서 작동하지 않습니다.


어떤 방법을 사용해야하는지 확실치 않은 경우 concat demuxer를 사용해보십시오.

참조


답변

MP4 파일

들어 .MP4 파일 : 다음에 대한 효과적인 솔루션이었다 (나는 DailyMotion.com에서 얻은 50 분 TV 에피소드, 만 세 부분으로 세 .MP4 비디오 파일을 다운로드 할) 윈도우 7 및 않습니다 NOT 재 인코딩을 포함 파일.

전체 TV 에피소드를 볼 수 있도록 올바른 순서 로 파일의 이름을 바꿨습니다 ( file1.mp4 , file2.mp4 , file3.mp4 ).

그런 다음 다음 내용 으로 간단한 배치 파일 (concat.bat)을 만들었습니다 .

:: Create File List
echo file file1.mp4 >  mylist.txt
echo file file2.mp4 >> mylist.txt
echo file file3.mp4 >> mylist.txt

:: Concatenate Files
ffmpeg -f concat -i mylist.txt -c copy output.mp4

배치 파일ffmpeg.exe 는 AS, 반드시 모두가 같은 폴더에 넣어 .MP4 파일을 결합 할 수 있습니다. 그런 다음 배치 파일을 실행하십시오. 실행하는 데 일반적으로 10 초 미만이 소요됩니다.
.

부록 (2018/10/21)-

찾고있는 것이 많은 재 입력없이 현재 폴더의 모든 mp4 파일을 지정하는 방법 인 경우 대신 Windows 배치 파일 에서 시도하십시오 ( 옵션 -safe 0 포함 해야 함 ).

:: Create File List
for %%i in (*.mp4) do echo file '%%i'>> mylist.txt

:: Concatenate Files
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4

이것은 Windows 7에서 배치 파일로 작동합니다. 배치 파일에서만 작동하기 때문에 명령 줄에서 사용 하지 마십시오 !


답변

다음은 중간 파일이 필요없이 빠르고 (1 분 미만 걸리는) 무손실 방법입니다.

ls Movie_Part_1.mp4 Movie_Part_2.mp4 | \
perl -ne 'print "file $_"' | \
ffmpeg -f concat -i - -c copy Movie_Joined.mp4

“ls”는 결합 할 파일을 포함합니다. “perl”은 연결 파일을 파이프로 즉석에서 작성합니다. “-i-“부분은 ffmpeg가 파이프에서 읽도록 지시합니다.

(참고-내 파일에는 공백이나 이상한 것들이 없었습니다. “하드”파일 로이 아이디어를 수행하려면 적절한 쉘 이스케이프가 필요합니다).


답변

MP4 파일의 경우 :

파일이 정확히 같지 않은 경우 (100 % 동일한 코덱, 동일한 해상도, 동일한 유형) MP4 파일 인 경우 먼저 중간 스트림으로 파일을 트랜스 코딩해야합니다.

ffmpeg -i myfile1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp1.ts
ffmpeg -i myfile2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp2.ts
// now join
ffmpeg -i "concat:temp1.ts|temp2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

노트! : 출력은 첫 번째 파일과 같으며 두 번째 파일은 아닙니다.


답변

세 개의 .mp3오디오 파일을 하나의 .m4a파일 로 연결하려고 했는데이 ffmpeg 명령이 작동합니다.

입력 명령 :

ffmpeg -i input1.mp3 -i input2.mp3 -i input3.mp3 \
       -filter_complex "concat=n=3:v=0:a=1" -f MOV -vn -y input.m4a

의미 :
-filter_complex “concat = n = 3 : v = 0 : a = 1” :

concat 은 미디어 연결 (결합) 기능을 사용함을 의미합니다.
n 은 입력 파일의 총 개수를 확인하는 것을 의미합니다.
v 는 비디오를 의미 합니까? 0 = 비디오 없음, 1 = 비디오 포함 수단 오디오를 가지고 ? 0 = 오디오 없음, 1 = 오디오 포함 -f 는 파일 세트 강제 설정을 의미합니다 (지원되는 모든 형식을 보려면을 사용하십시오 ). -vn 은 비디오를 비활성화합니다 ( 원치 않는 경우 오디오를 비활성화합니다) -y 는 출력 파일을 덮어 씁니다 (출력 파일이 이미 존재하는 경우).

ffmpeg -formats
-an

자세한 정보 : ffmpeg -h full
모든 옵션 인쇄 (모든 형식 및 코덱 별 옵션 포함)


답변

나는 mpg를 중간 형식으로 사용하여 효과가있었습니다. (이것은 위험한 예입니다. -qscale 0은 비디오를 다시 인코딩합니다 …)

ffmpeg -i 1.mp4 -qscale 0 1.mpg
ffmpeg -i 2.mp4 -qscale 0 2.mpg
cat 1.mpg 2.mpg | ffmpeg -f mpeg -i - -qscale 0 -vcodec mpeg4 output.mp4


답변

ffmpeg의 다양한 연결 방법에 대한 자세한 문서는 여기에서 찾을 수 있습니다 .

빠른 연결을 위해 ‘연결 필터’ 를 사용할 수 있습니다 .

다시 인코딩을 수행합니다. 이 옵션은 입력이 비디오 / 오디오 형식이 다른 경우에 가장 좋습니다.

2 개의 파일을 연결하는 경우 :

ffmpeg -i input1.mp4 -i input2.webm \
-filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]" \
-map "[v]" -map "[a]" output.mp4

3 개의 파일을 연결하는 경우 :

ffmpeg -i input1.mp4 -i input2.webm -i input3.mp4 \
-filter_complex "[0:v:0] [0:a:0] [1:v:0] [1:a:0] [2:v:0] [2:a:0] concat=n=3:v=1:a=1 [v] [a]" \
-map "[v]" -map "[a]" output.mp4

이것은 여러 입력 파일 형식뿐만 아니라 동일하게 작동합니다.