Dividir o MKV em pedaços menores que 4 GB?

Dividir o MKV em pedaços menores que 4 GB?

Preciso usar um dispositivo formatado em FAT32 para armazenar/compartilhar filmes (usando o recurso de compartilhamento de arquivos do meu roteador. Infelizmente, meu roteador não suporta ExFat, apenas FAT32.). FAT32 tem um limite para o tamanho dos arquivos, 4 GB. O BD de uma hora normalmente tem 4,5 GB, então tenho um problema aqui.

No entanto, o VLC parece suportar a reprodução contínua de arquivos se eles estiverem numerados (pelo menos um filme que eu tinha e que veio em dois CDsFilme CD1.avieFilme CD2.avifuncionou bem), então meu plano era simplesmente dividir meus arquivos muito grandes em partes um pouco menores que 4 GB. Como não preciso recodificar, deve ser razoavelmente rápido.

Eu leioessa questãosobre como usar o Handbrake para cortar vídeos, mas não é exatamente isso que eu quero fazer. Quero dizer ao Handbrake, ou qualquer outro software semelhante (de preferência disponível na versão Mac, mas também tenho acesso ao Win7 e Linux) "divida este MKV de 10 GB em quantos MKVs necessários com no máximo 3,5 GB" (por exemplo, 2 x 3,5 GB e 1 x 3 GB,Filme1.mkv, Filme2.mkv, Filme3.mkv).

Existe uma maneira fácil de fazer isso no Handbrake (ou algum outro software)?

Responder1

Aqui está um programa simples usando python. FFmpeg e FFprobe

Pequena descrição. O programa usa 'nome do arquivo' de entrada única. Por uma questão de brevidade, há uma verificação mínima de erros. Edite o script para definir o limite desejado antes da segmentação, extensão do segmento (geralmente 'parte','cd','disco')

Ele não recodifica apenas remuxos em segmentos de igual comprimento (duração).

As saídas padrão são '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')

informação relacionada