Skip to Content
Go Back
안형우

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

📌 워드프레스, 답답한 빌더와 플러그인 대신 시원하게 커스터마징하기(강의) 2023-01-15
📌 아무도 말하지 않는 PHP의 좋은 점 2018-10-13
📌 유지보수하기 쉬운 CSS 전략(슬라이드) 2016-12-20
📌 워드프레스 테마에서 템플릿 파일 매칭 순서 2013-05-12
📌 [번역] CSS 코드 냄새 2013-01-01

[번역] ffmpeg로 비디오 합치기

영상 편집을 하다가 컴퓨터 성능이 따라 주지 않아 결국 챕터별로(대충 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를 비롯한 많은 포맷에서 이 방법은 작동하지 않는다.

더 보기

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다