MKV を 4 GB 未満のチャンクに分割しますか?

MKV を 4 GB 未満のチャンクに分割しますか?

映画を保存/共有するには、FAT32 でフォーマットされたデバイスを使用する必要があります (ルーターのファイル共有機能を使用します。残念ながら、ルーターは ExFat をサポートしておらず、FAT32 のみをサポートしています)。FAT32 では、ファイルのサイズが 4 GB に制限されています。1 時間の BD は通常 4.5 GB なので、ここで問題が発生します。

しかし、VLCは番号が付けられているファイルのシームレスな再生をサポートしているようです(少なくとも私が持っていた2枚のCDに入っていた映画ではそうでした)ムービーCD1.aviそしてムービーCD2.aviうまく動作したので、私の計画は、大きすぎるファイルを 4 GB よりわずかに小さい部分に分割することでした。再エンコードする必要がないので、かなり高速になるはずです。

私は読むこの質問Handbrake を使ってビデオをトリミングする方法を知りたいのですが、それは私がやりたいことではありません。Handbrake または他の同様のソフトウェア (できれば Mac 版がありますが、Win7 と Linux も利用できます) に「この 10 GB の MKV を最大 3.5 GB の必要な数の MKV に分割する」(例: 2 x 3.5 GB と 1 x 3 GB、ムービー1.mkv、ムービー2.mkv、ムービー3.mkv)。

Handbrake (または他のソフトウェア) でこれを簡単に実現する方法はありますか?

答え1

これはPythonを使用した簡単なプログラムです。FFmpegとFFprobe

簡単な説明。プログラムは単一の入力「ファイル名」を受け取ります。簡潔にするために、エラー チェックは最小限に抑えられています。スクリプトを編集して、セグメント化の前に必要なしきい値、セグメント拡張子 (通常は「part」、「cd」、「disk」) を設定します。

再エンコードは行わず、同じ長さ (継続時間) のセグメントに再多重化するだけです。

デフォルトの出力は「filename.part#.mkv」です

import os, sys, subprocess

fthreshMB = 3900 # threshhold size in MB
fthresh = fthreshMB * 1024*1024
segext = '.part'
segstartnum = 1

# main
fp = sys.argv[1]
if not os.path.isfile(fp):
    print('Invalid file',fp)
    sys.exit(1)

fsize = os.path.getsize(fp)
if fsize < fthresh:
    print('File is below threshhold of',fthreshMB,'MB')
    sys.exit(0)
    
# get file duration
ffcmd = 'ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "' + fp + '"'
result = subprocess.run(ffcmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
fdur = float(result.stdout)

# number of segments
segs = 1
while (fsize / segs) > fthresh:
    segs += 1
segdur = int(fdur / segs)
print('duration',fdur,'seconds. divide into',segs,'segments of',segdur,'seconds. segment start number',segstartnum)

# split file
fn, fext = os.path.splitext(fp)
ffcmd = 'ffmpeg -hide_banner -y -i "' + fp + '" -c copy -map 0 -segment_time ' + str(segdur) + ' -f segment ' + \
        '-reset_timestamps 1 -segment_start_number ' + str(segstartnum) + ' "' + fn + segext + '%d' + fext + '"'
result = subprocess.run(ffcmd,capture_output=True)
if result.returncode == 0: print('success')
else: print('error')

関連情報