Разбить MKV на части размером менее 4 ГБ?

Разбить MKV на части размером менее 4 ГБ?

Мне нужно использовать устройство, отформатированное в FAT32, для хранения/обмена фильмами (используя функцию обмена файлами моего роутера. К сожалению, мой роутер не поддерживает ExFat, только FAT32.). FAT32 имеет ограничение на размер файлов — 4 ГБ. Часовой BD обычно весит 4,5 ГБ, поэтому у меня здесь проблема.

Однако VLC, похоже, поддерживает бесшовное воспроизведение файлов, если они пронумерованы (по крайней мере, у меня был фильм, который был на двух CD).Фильм CD1.aviиФильм CD2.aviотлично сработало), поэтому мой план был просто разделить мои слишком большие файлы на части немного меньше 4 ГБ. Поскольку мне не нужно перекодировать или что-то в этом роде, это должно быть достаточно быстро.

Я читаюэтот вопрособ использовании Handbrake для обрезки видео, но это не совсем то, что я хочу сделать. Я хочу сказать Handbrake или любой другой подобной программе (предпочтительно доступной в версии для Mac, но у меня также есть доступ к Win7 и Linux) "разделить этот 10 ГБ MKV на столько MKV, сколько необходимо, но не более 3,5 ГБ" (например, 2 x 3,5 ГБ и 1 x 3 ГБ,Фильм1.mkv, Фильм2.mkv, Фильм3.mkv).

Есть ли простой способ сделать это в Handbrake (или какой-либо другой программе)?

решение1

Вот простая программа с использованием Python. FFmpeg и FFprobe

Краткое описание. Программа принимает один ввод 'имя_файла'. Для краткости проверка ошибок минимальна. Отредактируйте скрипт, чтобы задать желаемый порог перед сегментацией, расширение сегмента (обычно 'part','cd','disk')

Он не перекодирует, а просто ремикширует в сегменты одинаковой длины (длительности).

Выходные данные по умолчанию: «имя_файла.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')

Связанный контент