2つの* .srtファイルをマージする方法

2つの* .srtファイルをマージする方法

よりこれ質問。

2つの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.srtcd1.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、少なくとも1つのウェブサイトがあります。聞こえない

答え2

2番目のSRTファイルのサブを最初のSRTファイルの最も近い既存のタイミングに追加する必要があるため、以下のスクリプトを考えました。

たとえば、これにより、さまざまな言語の字幕を1つのファイルにまとめることができます。スクリプトを変更し、異なる色で別のファイルの内容を追加することもできます。 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)ゼロ以外の終了コードで終了する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

関連情報