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

如何通过Python脚本为.mp4视频文件添加章节?

Python 自动化给MP4添加带标题章节的实现方法

你可以通过Python调用FFmpeg,自动生成章节元数据并嵌入视频,完全替代手动命令行操作。以下是两种常用场景的实现方案:

方案1:直接添加章节(不保留原视频元数据)

适合不需要保留原视频标题、作者等元数据的简单场景,直接生成章节配置并嵌入:

import subprocess
import tempfile
import os

def add_chapters_to_mp4(input_path, output_path, chapters):
    # 生成FFmpeg兼容的章节元数据文本
    metadata_content = ""
    for chapter in chapters:
        # 将秒转换为毫秒(FFmpeg章节默认时间基准为1/1000)
        start_ms = int(chapter['start'] * 1000)
        end_ms = int(chapter['end'] * 1000)
        metadata_content += f"""[CHAPTER]
TIMEBASE=1/1000
START={start_ms}
END={end_ms}
title={chapter['title']}

"""
    # 创建临时文件存储元数据
    with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
        f.write(metadata_content)
        temp_metadata = f.name

    try:
        # 调用FFmpeg嵌入章节
        cmd = [
            'ffmpeg',
            '-i', input_path,
            '-i', temp_metadata,
            '-map_metadata', '1',  # 使用临时文件的元数据覆盖原视频
            '-codec', 'copy',  # 直接复制音视频流,无重新编码
            '-y',  # 自动覆盖输出文件
            output_path
        ]
        subprocess.run(cmd, check=True)
        print(f"章节添加完成,输出文件:{output_path}")
    finally:
        # 清理临时文件
        os.unlink(temp_metadata)

# 示例调用
if __name__ == "__main__":
    INPUT_VIDEO = "input.mp4"
    OUTPUT_VIDEO = "output_with_chapters.mp4"
    CHAPTERS = [
        {'start': 0, 'end': 60, 'title': 'Beginning'},
        {'start': 60, 'end': 120, 'title': 'Middle'},
        {'start': 120, 'end': 180, 'title': 'End'}
    ]
    add_chapters_to_mp4(INPUT_VIDEO, OUTPUT_VIDEO, CHAPTERS)

方案2:保留原视频元数据并添加章节

如果需要保留原视频的标题、作者等元数据,先提取原元数据,再追加章节内容后重新嵌入:

import subprocess
import tempfile
import os

def add_chapters_preserve_metadata(input_path, output_path, chapters):
    # 1. 提取原视频的元数据到临时文件
    with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
        original_metadata = f.name
    cmd_extract = ['ffmpeg', '-i', input_path, '-f', 'ffmetadata', original_metadata]
    # 捕获输出避免控制台冗余信息
    subprocess.run(cmd_extract, check=True, capture_output=True)

    # 2. 生成章节内容并追加到原元数据
    chapter_content = ""
    for chapter in chapters:
        start_ms = int(chapter['start'] * 1000)
        end_ms = int(chapter['end'] * 1000)
        chapter_content += f"""[CHAPTER]
TIMEBASE=1/1000
START={start_ms}
END={end_ms}
title={chapter['title']}

"""
    with open(original_metadata, 'a', encoding='utf-8') as f:
        f.write(chapter_content)

    try:
        # 3. 嵌入更新后的元数据
        cmd_embed = [
            'ffmpeg',
            '-i', input_path,
            '-i', original_metadata,
            '-map_metadata', '1',
            '-codec', 'copy',
            '-y',
            output_path
        ]
        subprocess.run(cmd_embed, check=True)
        print(f"章节添加完成,原元数据已保留,输出文件:{output_path}")
    finally:
        os.unlink(original_metadata)

# 示例调用
if __name__ == "__main__":
    INPUT_VIDEO = "input.mp4"
    OUTPUT_VIDEO = "output_with_chapters_preserved.mp4"
    CHAPTERS = [
        {'start': 0, 'end': 60, 'title': 'Beginning'},
        {'start': 60, 'end': 120, 'title': 'Middle'},
        {'start': 120, 'end': 180, 'title': 'End'}
    ]
    add_chapters_preserve_metadata(INPUT_VIDEO, OUTPUT_VIDEO, CHAPTERS)

注意事项

  • 确保系统已安装FFmpeg,且FFmpeg可执行文件在系统PATH中;若未配置PATH,可在脚本中指定FFmpeg的完整路径(如'C:/ffmpeg/bin/ffmpeg.exe')
  • -codec copy 参数会跳过重新编码,处理速度极快,但如果原视频流存在损坏,可能需要移除该参数重新编码
  • 章节的start和end参数以秒为单位,脚本自动转换为FFmpeg要求的毫秒格式
  • 临时文件由tempfile模块自动创建和清理,无需手动管理

内容的提问来源于stack exchange,提问作者Random

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:07:07