如何不使用shutil仅通过Pathlib实现MP4文件的合并操作
仅用pathlib实现MP4文件合并的方案
可以完全不依赖shutil库,仅通过pathlib实现MP4文件合并需求。
原有代码的核心问题是Path.write_bytes()采用覆盖写入模式,每次调用都会清空输出文件的已有内容后再写入新字节,因此最终只会保留最后一个MP4文件的内容,无法完成多文件合并。
基础实现方案(适用于小体积MP4文件)
from pathlib import Path def combine(source: str, output: str): # 以二进制写入模式打开输出文件,首次打开会自动创建/清空文件 with Path(output).open('wb') as output_file: for idx, file in enumerate(Path(source).glob('*.mp4')): print(f'Merging {file} | 已完成{idx}个文件', end='\r') # 读取当前MP4文件字节直接写入输出文件流 output_file.write(file.read_bytes()) print(f"\n合并完成,输出文件绝对路径:{Path(output).resolve()}")
大文件优化方案(避免内存溢出)
如果待合并的MP4文件体积较大,read_bytes()会一次性将整个文件加载到内存中,可能导致内存占用过高,可改为逐块读写的实现:
from pathlib import Path def combine(source: str, output: str, chunk_size: int = 10 * 1024 * 1024): # 单次读写块大小设为10MB,可自行调整 with Path(output).open('wb') as output_file: for idx, file in enumerate(Path(source).glob('*.mp4')): print(f'Merging {file} | 已完成{idx}个文件', end='\r') with file.open('rb') as input_file: # 逐块读取写入,内存占用稳定在chunk_size附近 while chunk := input_file.read(chunk_size): output_file.write(chunk) print(f"\n合并完成,输出文件绝对路径:{Path(output).resolve()}")
注意:上述方案仅为二进制字节拼接,仅对ts转封装的分段MP4、无关键帧冲突的连续录制分段MP4有效,普通独立编码的MP4文件直接拼接后可能无法正常播放,这类场景需要使用ffmpeg等工具进行转码合并,该限制和是否使用shutil库无关,属于视频文件本身的编码特性决定。
内容的提问来源于stack exchange,提问作者mark12345
相关产品推荐
相关产品推荐

