MKV를 4GB보다 작은 청크로 분할하시겠습니까?

MKV를 4GB보다 작은 청크로 분할하시겠습니까?

영화를 저장/공유하려면 FAT32로 포맷된 장치를 사용해야 합니다(라우터의 파일 공유 기능을 사용합니다. 안타깝게도 내 라우터는 ExFat를 지원하지 않고 FAT32만 지원합니다.). FAT32에는 파일 크기가 4GB로 제한되어 있습니다. 1시간 BD는 일반적으로 4,5GB이므로 여기에 문제가 있습니다.

그러나 VLC는 파일에 번호가 매겨져 있는 경우 파일의 원활한 재생을 지원하는 것 같습니다(적어도 두 장의 CD로 제공되는 영화)영화 CD1.avi그리고영화 CD2.avi잘 작동함) 그래서 내 계획은 너무 큰 파일을 4GB보다 약간 작은 부분으로 나누는 것이었습니다. 다시 인코딩할 필요가 없으므로 상당히 빨라야 합니다.

나는 읽었다이 질문비디오를 다듬기 위해 Handbrake를 사용하는 방법에 대해 설명하고 있지만 정확히 제가 원하는 것은 아닙니다. Handbrake 또는 기타 유사한 소프트웨어(Mac 버전에서 사용하는 것이 좋지만 Win7 및 Linux에도 액세스할 수 있음)에 "이 10GB MKV를 최대 3,5GB에 해당하는 필요한 만큼의 MKV로 분할"(예: 2 x 3,5GB 및 1개의 3GB,Movie1.mkv, Movie2.mkv, Movie3.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')

관련 정보