FFMPEG으로 자막 추가하기, 순서 바꾸기, 기본 자막으로 설정하기




 

FFMPEG을 이용하여 영화 동영상 파일에 한글자막을 추가하고 기존 영어 자막과 순서를 바꾼 후 재생 시 한글자막을 기본 자막으로 나오게끔 설정하는 것을 한방에 처리하기 ^^

● 발상 : 영어 자막이 기본 내장이 되어 있는 영화 파일(mkv)에 한글 자막(srt)을 추가로 집어넣으면 자막 파일을 따로 보관하지 않아도 영화 파일 하나만 달랑 있으면 되니까 관리가 편해집니다.

● 전개 : 기본 영어 자막을 내장한 영화 파일에 한국어 자막을 추가로 집어넣습니다.

영화 파일의 파일 정보를 보면(ffprobe) 스트림 구성이

Stream #0:0 - video Stream #0:1 - audio Stream #0:2 - eng subtitle subrip (default)

위와 같이 기본형으로 되어 있을 때

Stream #0:0 - video Stream #0:1 - audio Stream #0:2 - eng subtitle subrip (default) Stream #0:3 - kor

이렇게 한국어 자막을 추가로 넣을 수 있습니다.

● 진화 : 그런데 기왕 자막 추가로 넣는 김에 한국어 자막을 기본으로 우선으로 하고 싶어졌습니다. 동영상 플레이어에서 옵션에서 '자막 선택 - 한국어'로 설정하는 것도 귀찮죠 ㅋㅋ 즉, 최종 스트림 구성을 아래처럼 셋업 하면 참 좋을 것 같습니다.

Stream #0:0 - video Stream #0:1 - audio Stream #0:2 - kor subrip (default) Stream #0:3 - eng subtitle subrip

최종적으로 위와 같이 하고 싶을 때 인코딩 없이 빠른 시간에 한방에 처리하는 방법이 있습니다.

● 방법 :

(1) 기본적으로 ffmpeg 을 이용한 자막 추가 형식은 다음과 같습니다.

ffmpeg -i 영화.mkv -i 한글자막.srt 영화.한글자막.mkv

(2) 좀 더 디테일하게 스트림 구성으로 해당 스트림 순서에 맞게 자막 파일을 넣으려면 아래처럼 하면 됩니다.

ffmpeg -y -i 영화.mkv -f srt -i 한글자막.srt -map 0:0 -map 0:1 -map 0:2 -map 1:0 -metadata:s:s:1 language=kor -c:v copy -c:a copy -c:s srt 영화.한글자막.mkv

* -y 옵션은 이미 있는 기존 파일을 덮어씌우기를 하게끔 하는 옵션입니다.

* -f srt 옵션은 srt 자막을 subrip으로 넣는 옵션. (인코더 프로그램으로 인코딩할 시 자막을 burn 시키는 게 아니라 그냥 자막 정보만 갖고 있게 하여 자막 보기 옵션을 ON/OFF 설정을 할 수 있음). 장점은 인코딩을 하는 게 아니라 시간이 무지 빠르고 자막을 입히는 게 아니라서 원본 영상에 손상을 주지 않습니다.

* -map 옵션이 재미난 옵션인데 스트림의 지도라는 개념에서 map입니다. 매트릭스 구성이라고 보면 되는데 0:0 형식에서 앞의 숫자는 파일 순서이고 뒤의 숫자는 스트림의 순서입니다. 즉 -map 0:0 이면 첫 번째 파일(위의 예시에서는 영화 파일)의 첫 번째 스트림(대부분 첫 번째 스트림은 video 채널, 여러 개의 video가 있는 경우엔 첫 번째 video)입니다. -map 1:0이라고 한다면 두 번째 파일(위의 예시에서는 한글자막 파일~)의 0번째 스트림(한 가지 언어로 되어 있는 자막 파일이라면 그냥 기본 자막 스트림)입니다.

* -c:v copy 옵션은 비디오 트랙 코덱을 원본 그대로 복사한다는 뜻입니다. (인코딩을 새로 하지 않음)

(3) 한글 자막을 추가하면서 기존 있던 영어 자막과 순서를 바꾸기

-map이 여러 개 나열이 되어 있는데 아웃풋 파일을 만들어내기 위해서 사용하는 각 파일, 각 스트림의 순서를 -map으로 지정해준 순서를 따릅니다. 위의 코드에서는 기존 영화 파일의 스트림 구성을 그대로 따르고 새로 추가하는 한글자막은 자동으로 Stream #0:3에 들어가게 됩니다. -map 옵션의 원리를 이해했다면 자막의 순서를 바꾸는 것은 매우 쉽습니다. 즉, 아래처럼 스트림 순서만 바꿔주면 됩니다.

ffmpeg -y -i 영화.mkv -f srt -i 한글자막.srt -map 0:0 -map 0:1 -map 1:0 -metadata:s:s:1 language=kor -map 0:2 -c:v copy -c:a copy -c:s srt -disposition:s:0 default -disposition:s:1 none 영화.한글자막.mkv

* -map 옵션을 보면 스트림 순서를 바꾸어주었습니다.

(2)에서는 영화파일:비디오-영화파일:오디오-영화파일-영어자막-한글자막파일:한글자막 순이었는데

(3)에서는 영화파일:비디오-영화파일:오디오-한글자막파알:한글자막-영화파일-영어자막 순으로 바꿔주었습니다.

이런 순서로 아웃풋 파일인 영화.한글자막.mkv가 생성이 되게 됩니다.

* -disposition:s:0 default -disposition:s:1 none 이 옵션은 첫 번째 자막을 default로 설정하고 두 번째 자막은 default 설정을 꺼줍니다. 앞선 옵션으로 첫 번째 자막이 한글 자막으로 세팅이 되었고 두 번째 자막이 영어 자막으로 순서가 바뀐 데다가 원래 영어 자막이 default 설정이 되어 있었으므로 이번 옵션으로 default 설정을 바꿔주는 것입니다.

파일 한 개씩 일일이 작업하기가 귀찮아서 해당 폴더 안에 있는 모든 동영상 파일과 한글 자막을 일괄로 작업하려면 배치파일을 만들어서 작업하면 됩니다.

Each_srt_to_MKV.CMD 혹은 Each_srt_to_MKV.BAT

@echo off color 07 TITLE SRT 자막파일 MKV에 넣기 REM ▩▩▩ 기본 설정 준비 ▩▩▩ set FFMPEG="c:\util\ffmpeg\bin\ffmpeg.exe" set FOLDER=%1 set FOLDER=%FOLDER:"=% set FILE_SET="*.mkv" cls echo ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ echo ※ echo ※ srt 자막파일을 mkv에 넣어서 합칩니다 echo ※ echo ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ echo. echo 자막 파일 형식은 srt 만 가능합니다... timeout /t 3 set SRT_OPTION=-f srt set MAP_OPTION=-map 0:0 -map 0:1 -map 1:0 -metadata:s:s:0 language=kor -map 0:2 set CODEC_OPTION=-c:v copy -c:a copy -c:s srt -disposition:s:0 default -disposition:s:1 none For /R %FOLDER% "%%G" IN (%FILE_SET%) do ( TITLE 현재 작업중인 파일 ▷▷▷ %%~pnxG %FFMPEG% -y -i "%%G" %SRT_OPTION% -i "%%~dpnG.srt" %MAP_OPTION% %CODEC_OPTION% "%%~dpnG.korsub.mkv" ) color 9f timeout /t 5

위 배치 파일은 제 PC와 동영상, 자막 파일 환경에 맞춘 배치파일이라서 다른 것에 적용할 때는 소스코드 수정이 필요합니다. 이 코드를 참고해서 수정을 해서 쓰면 됩니다.

위 코드로 만든 Each_srt_to_MKV.CMD의 실행 방식은 작업할 동영상 파일들이 있는 폴더를 마우스로 끌어다가 배치 파일 Each_srt_to_MKV.CMD(혹은 Each_srt_to_MKV.BAT) 위에 놓으면 됩니다. 그러면 배치 파일의 %1 변수에 의해 자동으로 끌어다온 폴더의 경로가 적용이 되고 FOR 문에 의해 해당 폴더 안에 있는 모든 파일을 하나씩 작업을 수행하게 됩니다.

● 결과 :






0 comments:

댓글 쓰기