docs/contributing/code/media-framework.md
本文档系统性地介绍 Ani 的 Media 框架。 文档更多关注模块、组件之间的交互,而不是代码细节。代码细节可以参阅源码内文档。
Media 框架是 Ani 对视频播放和缓存功能至关重要的系统,涵盖数据源、查询、选择、以及下载流程。
[!IMPORTANT] 请确保已阅读条目系统。
Media 框架由以下组件组成:
MediaSource:资源(Media)的提供商。
MediaSource 主要负责查询剧集的资源;MediaSourceManager:负责管理多个 MediaSource 实例:处理启用/禁用等;MediaFetcher:负责从多个 MediaSource 中同时查询资源并整合结果;MediaSelector:负责根据用户的偏好设置,从查询到的资源中的选择合适的。[!IMPORTANT] 请注意区分“数据源”和“资源”两个概念。
在与普通用户沟通时,“数据源”和“资源”的概念是模糊的。“资源选择器”可能也会说成“数据源选择器”。
在本技术文档中,我们会显式区分“数据源”和“资源”。“数据源”一定指代
MediaSource;“资源”一定指代Media。
为了帮助理解,我们先了解在播放视频时的“查询-选择-播放”全流程。我们将在之后介绍各个组件的细节。
在 APP 启动时,MediaSourceManager 会初始化所有 MediaSource 实例。这通常是从订阅中获取数据源列表,然后为它们分别创建
MediaSource。
APP 可能会有 50 个左右的 MediaSource 实例。
从用户进入播放页面到开始播放之间发生的事情,可以拆解为:
MediaSource 可选使用;MediaSourceManager 创建一个 MediaFetcher。该 fetcher 将会在后台并发查询所有数据源;
MediaSource 会使用查询请求中的部分或全部信息进行查询。MediaFetcher 都会合并该数据源的结果到一个综合结果列表,广播结果列表的更新;MediaSelector 会监听 MediaFetcher 的结果,每当有结果更新时都会重新过滤和排序
Media。Media 将会被划分为“包含”和“排除”两类,然后按用户偏好和排序规则排序;MediaSelector 自动选择一个资源;Media一个资源 Media 是从一个数据源中查询得到的,某个剧集的播放链接和相关信息。Media 包含以下重要属性:
kind:目前可以是在线视频 WEB 和 BitTorrent;episodeRange: EpisodeRange;播放一个剧集时,在技术上其实是播放了包含该剧集的 Media。元数据十分重要,它会直接影响后续的过滤和排序。
[!NOTE] 设计缺陷
你可能已经注意到了,
Media有一些设计缺陷:它可以支持多个剧集范围,但却只有一个标量“剧集名称” 属性,没办法表示多个剧集名称。目前只有在剧集范围为单个剧集的情况下,数据源才会提供“剧集名称”。 剧集的序号也有一些缺陷。我们计划在不久后的将来解决这些问题。
在设计上,一个 Media 可以包含多个视频文件,每个分别对应一个剧集,但这些剧集都必须属于同一个条目。
通常来说:
Media 只包含一个剧集;Media 只包含一个剧集;Media 可能包含一个条目的所有剧集。[!TIP]
更多 Media 相关文档: