よりこれ質問。
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.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
、少なくとも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.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