¿Dividir MKV en fragmentos de menos de 4 GB?

¿Dividir MKV en fragmentos de menos de 4 GB?

Necesito usar un dispositivo formateado en FAT32 para almacenar/compartir películas (usando la función de intercambio de archivos de mi enrutador. Desafortunadamente, mi enrutador no admite ExFat, solo FAT32). FAT32 tiene un límite de tamaño de archivos: 4 GB. El BD de una hora suele ser de 4,5 GB, así que aquí tengo un problema.

Sin embargo, VLC parece admitir la reproducción perfecta de archivos si están numerados (al menos una película que tenía y que venía en dos CD).Película CD1.aviyPelícula CD2.avifuncionó bien), así que mi plan era simplemente dividir mis archivos demasiado grandes en partes un poco más pequeñas que 4 GB. Como no necesito volver a codificar, debería ser razonablemente rápido.

Yo leoesta preguntasobre el uso de Handbrake para recortar videos, pero eso no es exactamente lo que quiero hacer. Quiero decirle a Handbrake, o cualquier otro software similar (preferiblemente disponible en la versión para Mac, pero también tengo acceso a Win7 y Linux) "divida este MKV de 10 GB en tantos MKV necesarios que tengan un máximo de 3,5 GB" (por ejemplo, 2 x 3,5 GB y 1 de 3 GB,Película1.mkv, Película2.mkv, Película3.mkv).

¿Existe una manera fácil de lograr esto en Handbrake (o algún otro software)?

Respuesta1

Aquí hay un programa simple que usa Python. FFmpeg y FFprobe

Breve descripción. El programa toma una única entrada 'nombre de archivo'. Para mayor brevedad, la verificación de errores es mínima. Edite el script para establecer el umbral deseado antes de segmentar, extensión del segmento (comúnmente 'parte', 'cd', 'disco')

No vuelve a codificar, solo remuxea en segmentos de igual longitud (duración).

Las salidas predeterminadas son 'nombre de archivo.parte#.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')

información relacionada