영상 편집을 하다가 컴퓨터 성능이 따라 주지 않아 결국 챕터별로(대충 1분 정도씩 돼 다행이었다) 잘라서 편집을 한 뒤 인코딩 결과물을 합치는 방법을 사용했다. 의외로 쓸만했다. 수정사항이 있어도 해당 챕터만 수정한뒤 인코딩하고 합치면 되니 괜찮았다.

ffmpeg를 이용해 영상을 합치면 5초도 안 걸렸다. 비디오 코덱와 해상도가 동일하니 말이다.

ffmpeg로 비디오를 합치는 방법에 대한 설명을 찾던 중 잘 정리된 스택오버플로우 답변이 있어서 번역한다.


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

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

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

[참고: mylist.txt라는 식으로 텍스트 파일을 만들어서 한 줄에 하나씩 합칠 파일을 적으라는 것이다. 적을 때는 file '파일경로+파일명' 식으로 적으라는 것이다. 이후 ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4 명령으로 합친다.]

윈도우에서는 이렇게:

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

concat protocol

파일 수준의 연결을 지원하는 포맷(MPEG-1, MPEG-2 PS, DV)이라면 이 방법을 사용한다. MP4에는 사용할 수 없다.

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

이 방법은 극도로 단순한 연결을 수행하는데, 포맷의 성질 때문에 MP4를 비롯한 많은 포맷에서 이 방법은 작동하지 않는다.

더 보기