我需要使用 FAT32 格式的设备来存储/共享电影(使用我的路由器文件共享功能。不幸的是,我的路由器不支持 ExFat,只支持 FAT32。)。FAT32 对文件大小有限制,为 4 GB。一小时的 BD 通常为 4.5 GB,所以我在这里遇到了问题。
不过,VLC 似乎支持无缝播放带编号的文件(至少我有一部分在两张 CD 上的电影)。电影CD1.avi和电影CD2.avi运行良好),所以我的计划是简单地将过大的文件分割成略小于 4 GB 的部分。由于我不需要重新编码,所以它应该相当快。
我读这个问题关于使用 Handbrake 修剪视频,但这并不是我想要做的。我想告诉 Handbrake 或任何其他类似软件(最好是 Mac 版本,但我也可以访问 Win7 和 Linux)“将这个 10 GB 的 MKV 分割成尽可能多的 MKV,最大为 3.5 GB”(例如 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')