두 개의 *.srt 파일을 병합하는 방법

두 개의 *.srt 파일을 병합하는 방법

보다이것질문.

방금 두 개의 avi 파일을 병합 cd1.avi하고 cd1.avi다음을 사용했습니다 movie.avi.

avimerge -o movie.avi -i cd{1,2}.avi

문제는 내가 해야 한다는 거야부제첫 번째 avi파일에 연결된 파일:

cd1.srt
cd2.srt

처음에는 간단히 파일을 연결해 보았습니다.

cat cd{1,2}.srt > movie.srt

그런데 자막이 너무 엉망이네요... 어떤 제안이 있으신가요?

답변1

.srt파일은 타임스탬프가 포함된 텍스트 파일이므로 매우 간단합니다 . cd1.avi에 길이를 추가하기 만 cd2.srt하면 됩니다 .cd1.aviffmpeg

ffmpeg -i cd1.avi  # Look for the Duration: line

cd2.srt그런 다음 사용 하여 추가하십시오.srttool

srttool -d 12345 -i cd2.srt  # 12345 is the amount to add in seconds

또는:

srttool -a hh:mm:ss -i cd2.srt  # The first subtitle will now start at hh:mm:ss

그러면 파일을 서로 연결하고 번호를 다시 매길 수 있습니다.

srttool -r -i cd.srt

나는 srttoolArch에 가 포함되어 있기 때문에 이것을 선택했습니다 .transcode이 문제;파일 이동 및 병합을 위한 다른 도구도 많이 있으며 .srt, 적어도 하나의 웹사이트가 있습니다.안 들리게 하다

답변2

두 번째 SRT 파일의 서브를 첫 번째 SRT 파일의 가장 가까운 기존 타이밍에 추가해야 하므로 아래 스크립트를 생각해 냈습니다.

예를 들어, 이렇게 하면 다양한 언어의 자막을 하나의 파일로 결합할 수 있습니다. 스크립트를 수정하고 다른 색상으로 다른 파일의 내용을 추가할 수도 있습니다. SRT 파일에서 이 작업을 수행하기 위해 지원되는 유일한 구문은 <font color="#00ffff">text here</font>.

스크립트에는 최신 python3이 필요하며srt설치할 수 있는 모듈 pip3 install srt.

용법:

python3 merge_srt.py first.srt second.srt
#!/usr/bin/env python3

import argparse
import sys
from datetime import timedelta
from pathlib import Path

# pip3 install srt
import srt


def nearest(items, pivot):
    return min(items, key=lambda x: abs(x.start - pivot))


if __name__ == '__main__':

    parser = argparse.ArgumentParser(description='merge SRT subtitles',
                                     usage="""
    Merge SRT subtitles:                                     
    \t{0} first.srt second.srt -o merged.srt
 """.format(Path(sys.argv[0]).name))

    parser.add_argument('srt1',
                        metavar='srt1',
                        help='SRT-file-1')
    parser.add_argument('srt2',
                        metavar='srt2',
                        help='SRT-file-2')
    parser.add_argument('--output-file', '-o',
                        default=None,
                        help='Output filename')
    parser.add_argument('--encoding', '-e',
                        default=None,
                        help='Input file encoding')
    args = parser.parse_args(sys.argv[1:])

    srt1_path = Path(args.srt1)
    srt2_path = Path(args.srt2)

    with srt1_path.open(encoding=args.encoding or 'utf-8') as fi1:
        subs1 = {s.index: s for s in srt.parse(fi1)}

    with srt2_path.open(encoding=args.encoding or 'utf-8') as fi2:
        subs2 = {s.index: s for s in srt.parse(fi2)}

    # iterate all subs in srt2 and find the closest EXISTING slots in srt1
    for idx, sub in subs2.items():

        start: timedelta = sub.start
        sub_nearest_slot: srt.Subtitle = nearest(subs1.values(), start)
        sub_nearest_slot.content = f'{sub_nearest_slot.content}<br>{sub.content}'
        subs1[sub_nearest_slot.index] = sub_nearest_slot

    if not args.output_file:
        generated_srt = srt1_path.parent / (f'{srt1_path.stem}_MERGED_{srt1_path.suffix}')
    else:
        generated_srt = Path(args.output_file)

    with generated_srt.open(mode='w', encoding='utf-8') as fout:
        fout.write(srt.compose(list(subs1.values())))

답변3

나는 받아 들인 대답을 좋아한다. 불행히도 (a) 0이 아닌 종료 코드로 종료되는 ffmpeg 호출과 (b) homebrew에서는 분명히 사용할 수 없는 srttool에 의존합니다.

또한 여러 파일에 대해 더 많은 자동화를 수행할 수 있는 기능을 원했습니다(4GB마다 파일을 분할하는 DJI 드론을 사용하고 있기 때문입니다).

드디어 썼다srt 연결프로젝트의 일부로 jaraco.media. Python 환경(및 필요한 전문 지식)이 필요하지만 설치 및 실행이 쉽습니다. pip install jaraco.mediaPython 환경으로 이동하여 추가 python -m jaraco.media.srt-concat ...정보 파일의 지침을 따르세요. 일치하는 각 SRT 파일과 연관된 미디어 파일을 감지하고, 이러한 파일의 지속 시간을 계산하고, SRT 항목을 연결할 때 집계된 지속 시간을 추가하려고 시도합니다.

답변4

허용되는 답변은 ffmpegthen 을 사용합니다 srttool. 이미 설치하셨다면 ffmpeg바로 사용하실 수 있습니다.연결 디멀티플렉서다른 것은 필요하지 않습니다.

$ cat mylist.txt
file '/path/to/file1.srt'
file '/path/to/file2.srt'
file '/path/to/file3.srt'
    
$ ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.srt

관련 정보