我需要使用 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 分割成所需的最大 3,5 GB 的 MKV」(例如 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')