当前位置: 首页 > news >正文

Media3 中 Window 的时间相关属性详解

AndroidX Media3 的 Timeline.Window 类中,与时间相关的属性描述了媒体播放窗口(window)在时间维度上的关键信息。这些属性帮助开发者理解媒体的播放范围、起始点、持续时间以及与设备时间或直播流的同步关系。

Timeline.Window 的时间相关属性如下:

属性名类型描述
presentationStartTimeMslong媒体可播放的最早时间(毫秒,相对于 Unix 纪元),通常用于直播,可能为 C.TIME_UNSET
windowStartTimeMslong窗口的实际开始时间(毫秒,相对于 Unix 纪元),通常用于直播,可能为 C.TIME_UNSET
elapsedRealtimeEpochOffsetMslong窗口开始时间与设备 elapsedRealtime() 的偏移量(毫秒),用于时间同步,可能为 C.TIME_UNSET
defaultPositionMslong默认播放起始位置(毫秒),相对于窗口开始,通常为 0 或上次播放位置。
durationMslong窗口总持续时间(毫秒),可能是 C.TIME_UNSET(如直播流)。
positionInFirstPeriodMslong窗口起始位置相对于第一个周期(period)的偏移量(毫秒)。

C.TIME_UNSET(值为 -9223372036854775807L)表示时间未设置,常用于直播或未完全加载的媒体。属性分为绝对时间(相对于 Unix 纪元,如 presentationStartTimeMs)和相对时间(相对于窗口内部,如 defaultPositionMs)。

presentationStartTimeMs
  • 类型long(毫秒)
  • 含义
    • 表示媒体内容可播放的最早时间,基于 Unix 纪元(1970-01-01 00:00:00 UTC)。
    • 通常用于直播流,定义直播内容的理论开始时间。
    • 如果未设置(C.TIME_UNSET),表示时间未知(常见于点播或未加载完成的直播)。
  • 用途
    • 帮助播放器确定直播流的有效时间范围。
    • 用于计算直播流的延迟(currentPosition - presentationStartTimeMs)。
  • 在窗口时间轴上的位置
    • 通常是时间轴的最左侧点,表示窗口可播放的最早时间。
    • 如果为 C.TIME_UNSET,在时间轴上可能是未定义的起点(用虚线或注释表示)。
  • 示例
    • 假设直播流在 2023-10-01 10:00:00 UTC 开始,presentationStartTimeMs 可能为 1696154400000(毫秒)。
windowStartTimeMs
  • 类型long(毫秒)
  • 含义
    • 表示窗口的实际开始时间,基于 Unix 纪元,可以落后presentationStartTimeMs一天或者更久,是window实际开播时间。
    • 通常用于直播流,表示播放器可以访问的直播内容的开始时间(可能比 presentationStartTimeMs 稍晚)。
    • 如果未设置(C.TIME_UNSET),表示时间未知(常见于点播或直播缓冲区未初始化)。
  • 用途
    • 确定直播窗口的实际可播放范围。
    • elapsedRealtimeEpochOffsetMs 结合,用于同步设备时间和直播时间。
  • 在窗口时间轴上的位置
    • 位于 presentationStartTimeMs 之后(或重叠),是时间轴的实际起点
    • 在直播场景中,它通常是播放器开始加载内容的时刻。
    • 如果为 C.TIME_UNSET,在时间轴上可能是未定义的起点。
  • 示例
    • 直播流可能在 presentationStartTimeMs 后几秒开始缓冲,windowStartTimeMs1696154405000(比 presentationStartTimeMs 晚 5 秒)。
elapsedRealtimeEpochOffsetMs
  • 类型long(毫秒)
  • 含义
    • 表示 windowStartTimeMs(Unix 纪元时间)与设备 elapsedRealtime()(设备启动后的毫秒数)之间的偏移量。
    • 公式:windowStartTimeMs = elapsedRealtime() + elapsedRealtimeEpochOffsetMs
    • 用于同步直播流的绝对时间与设备本地时间。
    • 如果未设置(C.TIME_UNSET),表示无法同步(常见于点播或直播未提供时间信息)。
  • 用途
    • 在直播场景中,帮助播放器将本地时间转换为直播流的绝对时间。
    • 用于精确计算直播流的当前播放位置(currentPositionMs + elapsedRealtimeEpochOffsetMs)。
  • 在窗口时间轴上的位置
    • 不在时间轴上的直接点,而是作为 windowStartTimeMs 的参考偏移。
    • 在图中通常标注为时间轴外的箭头或注释,指向 windowStartTimeMs,表示偏移关系。
  • 示例
    • 如果 windowStartTimeMs = 1696154405000,当前 elapsedRealtime() = 1000000,则 elapsedRealtimeEpochOffsetMs = 1696154405000 - 1000000
defaultPositionMs
  • 类型long(毫秒)
  • 含义
    • 表示播放器默认开始播放的位置,相对于窗口的逻辑起点(通常是 windowStartTimeMs 或窗口的 0 点)。
    • 对于点播,通常为 0(从头播放)或上次播放位置(续播)。
    • 对于直播,通常接近窗口的末端(最新可用内容)。
  • 用途
    • 确定播放器初始化时的播放位置。
    • 用户可以通过 seekTo(defaultPositionMs) 跳转到该位置。
  • 在窗口时间轴上的位置
    • 位于时间轴的起始段,通常接近窗口的逻辑起点(0mswindowStartTimeMs)。
    • 在点播中,它可能是时间轴的 0 点;在直播中,它可能靠近 durationMs 的末端。
  • 示例
    • 点播视频:defaultPositionMs = 0(从头开始)。
    • 直播流:defaultPositionMs = 30000(距离窗口末端 30 秒)。
durationMs
  • 类型long(毫秒)
  • 含义
    • 表示窗口的总持续时间(毫秒),从逻辑起点到结束。
    • 对于点播,是视频的总长度(如 3600000ms 表示 1 小时)。
    • 对于直播,可能是缓冲区长度,或 C.TIME_UNSET(表示未知,如无限直播)。
  • 用途
    • 确定播放器可播放的时间范围。
    • 用于进度条显示和 seek 操作(seekTo(positionMs < durationMs))。
  • 在窗口时间轴上的位置
    • 表示时间轴的整个长度,从逻辑起点(通常 defaultPositionMs 或 0)到结束点。
    • 如果为 C.TIME_UNSET,时间轴末端可能是开放的(用箭头或虚线表示)。
  • 示例
    • 点播:durationMs = 600000(10 分钟视频)。
    • 直播:durationMs = C.TIME_UNSET(无限直播)或 60000(60 秒缓冲区)。
positionInFirstPeriodMs
  • 类型long(毫秒)
  • 含义
    • 表示窗口的逻辑起点相对于第一个周期(Timeline.Period)的偏移量。
    • Timeline 由多个周期组成,每个周期可能代表媒体的一个片段(如 HLS 的分片)。
    • 该属性定义窗口的起始点在第一个周期内的具体位置。
  • 用途
    • 用于多周期媒体(如 DASH、HLS)中,确定窗口与周期的相对位置。
    • 帮助播放器在周期边界正确 seek 或切换。
  • 在窗口时间轴上的位置
    • 位于 defaultPositionMs 附近,通常是子偏移,表示窗口起点在第一个周期内的位置。
    • 如果窗口只有一个周期,positionInFirstPeriodMs 可能等于 defaultPositionMs
  • 示例
    • HLS 流,第一个周期为 10 秒,窗口从第 5 秒开始:positionInFirstPeriodMs = 5000
http://www.xdnf.cn/news/328519.html

相关文章:

  • MySQL 1205错误:Lock wait timeout exceeded问题处理
  • 词编码模型和回答问题的LLM是否为同一个; 词编码模型和回答问题模型分开时:需要保证词嵌入维度一致吗
  • 软考【软考高级QA】
  • DSENT (Design Space Exploration of Networks Tool) 配合gem5
  • 时间序列数据集增强构造方案(时空网络建模)
  • 【网络编程】二、UDP网络套接字编程详解
  • 项目文档归档的最佳实践有哪些?
  • Nacos源码—Nacos集群高可用分析(二)
  • java实现一个操作日志模块功能,怎么设计
  • 【云备份】项目展示项目总结
  • 深入理解Redis缓存与数据库不一致问题及其解决方案
  • Matlab 多策略改进蜣螂优化算法及其在CEC2017性能
  • PCI-Compatible Configuration Registers--BIST Register (Offset 0Fh)
  • 跨物种交流新时代!百度发布动物语言转换专利,听懂宠物心声
  • 电池管理系统BMS三级架构——BMU、BCU和BAU详解
  • Webug4.0靶场通关笔记20- 第25关越权查看admin
  • 读《暗时间》有感
  • 基于RT-Thread的STM32G4开发第二讲第二篇——ADC
  • 2014年写的一个文档《基于大数据应用的综合健康服务平台研发及应用示范》
  • layui下拉框输入关键字才出数据
  • JMeter快速指南:命令行生成HTML测试报告(附样例命令解析)
  • Android学习总结之网络篇补充
  • conda init before conda activate
  • MVC是什么?分别对应SpringBoot哪些层?
  • 【C/C++】ARM处理器对齐_伪共享问题
  • autojs和冰狐智能辅助该怎么选择?
  • 从D盘分配空间为C盘扩容?利用工具1+1>2
  • 使用JMeter 编写的测试计划的多个线程组如何生成独立的线程组报告
  • 理解文本嵌入:语义空间之旅
  • 探索 H-ZERO 模态框组件:提升用户交互体验的利器