보다이것질문.
방금 두 개의 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.avi
ffmpeg
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
나는 srttool
Arch에 가 포함되어 있기 때문에 이것을 선택했습니다 .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.media
Python 환경으로 이동하여 추가 python -m jaraco.media.srt-concat ...
정보 파일의 지침을 따르세요. 일치하는 각 SRT 파일과 연관된 미디어 파일을 감지하고, 이러한 파일의 지속 시간을 계산하고, SRT 항목을 연결할 때 집계된 지속 시간을 추가하려고 시도합니다.
답변4
허용되는 답변은 ffmpeg
then 을 사용합니다 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