You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:06:00