如何通过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
相关产品推荐
相关产品推荐

