AndroidX Media3 的 Timeline.Window
類中,與時間相關的屬性描述了媒體播放窗口(window)在時間維度上的關鍵信息。這些屬性幫助開發者理解媒體的播放范圍、起始點、持續時間以及與設備時間或直播流的同步關系。
Timeline.Window
的時間相關屬性如下:
屬性名 | 類型 | 描述 |
---|---|---|
presentationStartTimeMs | long | 媒體可播放的最早時間(毫秒,相對于 Unix 紀元),通常用于直播,可能為 C.TIME_UNSET 。 |
windowStartTimeMs | long | 窗口的實際開始時間(毫秒,相對于 Unix 紀元),通常用于直播,可能為 C.TIME_UNSET 。 |
elapsedRealtimeEpochOffsetMs | long | 窗口開始時間與設備 elapsedRealtime() 的偏移量(毫秒),用于時間同步,可能為 C.TIME_UNSET 。 |
defaultPositionMs | long | 默認播放起始位置(毫秒),相對于窗口開始,通常為 0 或上次播放位置。 |
durationMs | long | 窗口總持續時間(毫秒),可能是 C.TIME_UNSET (如直播流)。 |
positionInFirstPeriodMs | long | 窗口起始位置相對于第一個周期(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
(毫秒)。
- 假設直播流在 2023-10-01 10:00:00 UTC 開始,
windowStartTimeMs
- 類型:
long
(毫秒) - 含義:
- 表示窗口的實際開始時間,基于 Unix 紀元,可以落后
presentationStartTimeMs
一天或者更久,是window
實際開播時間。 - 通常用于直播流,表示播放器可以訪問的直播內容的開始時間(可能比
presentationStartTimeMs
稍晚)。 - 如果未設置(
C.TIME_UNSET
),表示時間未知(常見于點播或直播緩沖區未初始化)。
- 表示窗口的實際開始時間,基于 Unix 紀元,可以落后
- 用途:
- 確定直播窗口的實際可播放范圍。
- 與
elapsedRealtimeEpochOffsetMs
結合,用于同步設備時間和直播時間。
- 在窗口時間軸上的位置:
- 位于
presentationStartTimeMs
之后(或重疊),是時間軸的實際起點。 - 在直播場景中,它通常是播放器開始加載內容的時刻。
- 如果為
C.TIME_UNSET
,在時間軸上可能是未定義的起點。
- 位于
- 示例:
- 直播流可能在
presentationStartTimeMs
后幾秒開始緩沖,windowStartTimeMs
為1696154405000
(比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)
跳轉到該位置。
- 在窗口時間軸上的位置:
- 位于時間軸的起始段,通常接近窗口的邏輯起點(
0ms
或windowStartTimeMs
)。 - 在點播中,它可能是時間軸的 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
。
- HLS 流,第一個周期為 10 秒,窗口從第 5 秒開始: