youtube-dl 中的后处理系统负责在检索媒体文件后对其进行操作。这包括格式转换、字幕提取或嵌入、添加缩略图以及对下载内容进行其他修改。该系统设计为管道,可以将多个后处理器按顺序应用于下载的文件。
有关下载过程本身的更多信息,请参阅 下载器系统。有关特定后处理器类型的更多详细信息,请参阅 格式转换 和 元数据和字幕处理。
后处理系统围绕一个基础的 PostProcessor 类组织,该类定义了所有后处理器必须实现的接口。各种专门的后处理器会继承这个基础类以提供特定的功能。
来源: youtube_dl/postprocessor/embedthumbnail.py1-134
来源: youtube_dl/postprocessor/embedthumbnail.py29-133
PostProcessor 基础类定义了所有后处理器必须遵循的合同
__init__(downloader): 接收下载器对象的构造函数run(information): 运行后处理器的主要方法,返回一个 (待删除文件, 信息) 元组FFmpegPostProcessor 是依赖 FFmpeg 进行媒体操作的后处理器的专用基类。它提供以下方法:
| 后处理器类型 | 描述 | 实现类 |
|---|---|---|
| 格式转换 | 将媒体转换为不同格式 | FFmpegVideoConvertorPP |
| 元数据嵌入 | 将元数据添加到媒体文件 | FFmpegMetadataPP, XAttrMetadataPP |
| 缩略图嵌入 | 将缩略图嵌入媒体文件 | EmbedThumbnailPP |
| 字幕处理 | 提取或转换字幕格式 | SubtitlesConvertorPP |
| 文件合并 | 合并单独的音频和视频文件 | FFmpegMergerPP |
来源: youtube_dl/postprocessor/embedthumbnail.py28-133
EmbedThumbnailPP 提供了一个后处理器如何工作的绝佳示例。它使用 FFmpeg(用于 MP3 文件)或 AtomicParsley(用于 M4A/MP4 文件)将缩略图嵌入下载的媒体文件中。
来源: youtube_dl/postprocessor/embedthumbnail.py33-133
EmbedThumbnailPP 后处理器处理了几个挑战
该处理器确保使用适合每种文件格式的工具正确嵌入缩略图
For MP3: FFmpeg is used with options to add metadata for the album cover
For M4A/MP4: AtomicParsley is used to add the artwork
来源: youtube_dl/postprocessor/embedthumbnail.py80-131
后处理系统包含专门的错误类来处理处理过程中的特定错误场景
这些错误类提供了有关后处理过程中出现问题的详细信息,帮助用户解决问题。
来源: youtube_dl/postprocessor/embedthumbnail.py24-26
后处理器通常依赖外部工具来执行其操作。常用依赖项包括:
| 工具 | 用途 | 目的 |
|---|---|---|
| FFmpeg | FFmpegPostProcessor 及其子类 | 媒体转换、合并和元数据操作 |
| AtomicParsley | EmbedThumbnailPP | 将缩略图嵌入 M4A/MP4 文件 |
系统会检查这些依赖项是否存在,并在缺少时提供信息性错误消息。
来源: youtube_dl/postprocessor/embedthumbnail.py95-100
后处理器通常通过通用工作流管理文件
此模式可以在 EmbedThumbnailPP 的实现中看到
1. Create temp_filename by prepending 'temp.' to the filename
2. Process the file with FFmpeg or AtomicParsley, writing to temp_filename
3. Remove the original file if processing was successful
4. Rename temp_filename to the original filename
来源: youtube_dl/postprocessor/embedthumbnail.py34-36 youtube_dl/postprocessor/embedthumbnail.py91-93 youtube_dl/postprocessor/embedthumbnail.py127-129
后处理系统通过标准化的工作流与 YoutubeDL 核心集成
这种架构允许后处理器链式连接,每个处理器都基于前一个处理器的结果进行构建。
来源: youtube_dl/postprocessor/embedthumbnail.py29-33
后处理系统设计为可扩展的。可以通过以下方式创建新的后处理器:
PostProcessor 或更具体的基类,如 FFmpegPostProcessorrun 方法来处理文件并返回 (待删除文件, 信息) 这种模块化设计易于为 youtube-dl 系统添加新的后处理功能。