本文档介绍了 youtube-dl 中分段媒体流的下载器。分段媒体下载器处理将内容分割成多个片段而非作为一个单一文件传输的流媒体格式。这包括 HLS (HTTP Live Streaming)、DASH (Dynamic Adaptive Streaming over HTTP)、F4M (Flash Media Manifest) 和 ISM (IIS Smooth Streaming) 等协议。
有关通用下载器架构的信息,请参阅 下载器系统 和 FileDownloader 基类。有关非分段媒体的 HTTP 下载,请参阅 HTTP 下载器。
youtube-dl 中的分段媒体下载器共享一个基类,该基类处理下载多个片段并将它们合并成一个文件的核心逻辑。然后,每个特定于协议的下载器实现该协议所需的具体细节。
来源: youtube_dl/downloader/fragment.py youtube_dl/downloader/hls.py youtube_dl/downloader/f4m.py youtube_dl/downloader/dash.py youtube_dl/downloader/ism.py
来源: youtube_dl/downloader/fragment.py97-120 youtube_dl/downloader/fragment.py133-167 youtube_dl/downloader/fragment.py268-295
FragmentFD 类在 youtube_dl/downloader/fragment.py 提供了所有分段下载器共享的核心功能。它处理以下过程:
| 方法 | 目的 |
|---|---|
_prepare_frag_download | 设置下载上下文,创建临时文件,处理续传 |
_start_frag_download | 初始化进度报告,设置钩子 |
_download_fragment | 使用 HTTP 下载器下载单个片段 |
_append_fragment | 将下载的片段添加到输出文件 |
_finish_frag_download | 完成下载,将临时文件重命名为最终文件名 |
来源: youtube_dl/downloader/fragment.py youtube_dl/downloader/fragment.py133-167 youtube_dl/downloader/fragment.py206-267 youtube_dl/downloader/fragment.py268-295
分段下载过程使用共享的上下文字典来维护下载过程中多个方法调用的状态。上下文中的关键元素包括:
filename:最终目标文件名tmpfilename:下载期间的临时文件fragment_index:正在处理的当前片段total_frags:片段总数dest_stream:用于写入片段的文件句柄fragment_filetime:片段的时间戳complete_frags_downloaded_bytes:到目前为止已下载的总字节数来源: youtube_dl/downloader/fragment.py youtube_dl/downloader/fragment.py206-267
对于未完成的分段下载,youtube-dl 会维护扩展名为 .ytdl 的账簿文件。这些 JSON 文件会跟踪:
这使得中断的下载可以在稍后从中断点继续。
{
"downloader": {
"current_fragment": {
"index": [current_fragment_index]
},
"fragment_count": [total_fragment_count]
}
}
来源: youtube_dl/downloader/fragment.py73-96
HLS (HTTP Live Streaming) 下载器支持 Apple 的 HLS 协议,该协议在 iOS 设备、Apple TV 和许多 Web 平台上广泛用于流媒体。
HlsFD 支持
HlsFD 无法处理(委托给 FFmpeg)
来源: youtube_dl/downloader/hls.py youtube_dl/downloader/hls.py60-216
F4M 下载器处理 Adobe 的 Flash Media Manifest 格式,该格式曾广泛用于基于 Flash 的流。
F4M 下载器
来源: youtube_dl/downloader/f4m.py319-438
DASH 下载器处理 MPEG-DASH (Dynamic Adaptive Streaming over HTTP) 流,这被 YouTube 等平台广泛使用。
来源: youtube_dl/downloader/dash.py13-83
ISM 下载器支持 Microsoft 的 IIS Smooth Streaming 格式。
来源: youtube_dl/downloader/ism.py206-259
所有分段下载器都支持通过以下方式恢复中断的下载:
if self.__do_ytdl_file(ctx):
ytdl_file_exists = os.path.isfile(encodeFilename(self.ytdl_filename(ctx['filename'])))
if continuedl and ytdl_file_exists:
self._read_ytdl_file(ctx)
来源: youtube_dl/downloader/fragment.py171-193
来源: youtube_dl/downloader/hls.py youtube_dl/downloader/hls.py171-181
直播流带来了特殊的挑战
HLS 和 F4M 下载器对直播流有特殊的处理方式
来源:youtube_dl/downloader/hls.py36-42 youtube_dl/downloader/f4m.py194-207 youtube_dl/downloader/f4m.py429-434
当原生下载器无法处理特定流时
来源:youtube_dl/downloader/hls.py68-78 youtube_dl/downloader/fragment.py56-62
分段下载器与提取器系统协同工作,提取器系统提供必要的元数据
YouTube、Twitch 和广播媒体网站等提取器通常会在传递给下载器的 info_dict 中提供这些信息。
来源:youtube_dl/downloader/hls.py60-62 youtube_dl/downloader/f4m.py320-322 youtube_dl/downloader/dash.py20-23