?鴻蒙文檔中心:使用AVPlayer播放視頻(ArkTS)文檔中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-playback
這張圖描述的是 HarmonyOS AVPlayer 音頻播放器的狀態流轉過程,展示了 AVPlayer 在不同狀態之間的切換條件和關鍵操作。
1. 核心狀態說明
圖中展示了 AVPlayer 的 7 個核心狀態:
- idle(空閑):初始狀態或調用
reset()
后的狀態。 - initialized(初始化):設置播放源(如
fdSrc
或url
)后的狀態。 - prepared(準備完成):調用
prepare()
成功后的狀態。 - playing(播放中):調用
play()
后的狀態。 - paused(暫停):調用
pause()
后的狀態。 - completed(播放完成):音頻自然播放結束后的狀態。
- stopped(停止):調用
stop()
后的狀態。
2. 狀態流轉詳細過程
(1) idle → initialized
- 觸發條件:調用
AVPlayer.create()
創建播放器后,設置播放源(如fdSrc
或url
)。
關鍵操作:
const avPlayer = await media.createAVPlayer(); // 創建播放器(進入 idle)
avPlayer.fdSrc = { fd, offset, length }; // 設置播放源(進入 initialized)
(2) initialized → prepared
- 觸發條件:調用
prepare()
方法。
關鍵操作:
- typescript復制下載avPlayer.prepare(); // 準備播放(進入 prepared)
- 備注:此時播放器已加載音頻元數據(如時長),但還未開始播放。
(3) prepared → playing
- 觸發條件:調用
play()
方法。
關鍵操作:
- typescript復制下載avPlayer.play(); // 開始播放(進入 playing)
- 備注:此時音頻開始播放,
timeUpdate
回調會持續更新進度。
(4) playing ? paused
- 雙向切換:
playing → paused:調用 pause()
。
-
- typescript復制下載avPlayer.pause(); // 暫停播放(進入 paused)
paused → playing:再次調用 play()
。
-
- typescript復制下載avPlayer.play(); // 恢復播放(回到 playing)
(5) playing → completed
- 觸發條件:音頻自然播放結束(無需手動調用)。
- 關鍵行為:
-
- 播放器自動進入
completed
狀態。 - 觸發
stateChange
回調,通知應用播放結束。
- 播放器自動進入
(6) completed → playing
- 觸發條件:調用
seek(0)
+play()
(如代碼中的邏輯)。
關鍵操作
avPlayer.seek(0); // 跳轉到開頭
avPlayer.play(); // 重新播放(回到 playing)
(7) 任何狀態 → stopped
- 觸發條件:調用
stop()
方法。
關鍵操作:
- typescript復制下載avPlayer.stop(); // 停止播放(進入 stopped)
- 備注:停止后需調用
reset()
或release()
清理資源。
(8) stopped → idle
- 觸發條件:調用
reset()
方法。
關鍵操作:
- typescript復制下載avPlayer.reset(); // 重置播放器(回到 idle)
- 備注:此時可以重新設置播放源(
fdSrc
),開啟新一輪播放。
(9) 終止狀態:released
- 觸發條件:調用
release()
方法。
關鍵操作:
- typescript復制下載avPlayer.release(); // 釋放播放器資源(不可逆)
- 備注:釋放后播放器不可再用,需重新創建實例。
3. 關鍵注意事項
- 錯誤處理:
-
- 任何狀態都可能因錯誤跳轉到
error
狀態,需監聽on('error')
回調。 - 典型處理方式是調用
reset()
回到idle
狀態。
- 任何狀態都可能因錯誤跳轉到
- 進度控制:
-
seek()
只能在playing
、paused
或completed
狀態下調用。- 調用
seek()
后會觸發seekDone
回調。
- 資源釋放:
-
- 頁面退出時(
aboutToDisappear
)必須調用release()
,避免內存泄漏。
- 頁面退出時(
- 狀態檢查:
-
- 調用任何方法前應檢查當前狀態(如
avPlayer.state
),避免非法操作。
- 調用任何方法前應檢查當前狀態(如
總結
這張圖清晰地描述了 AVPlayer 的生命周期和狀態驅動模型,開發者需要:
- 按順序操作(如先
prepare()
再play()
)。 - 處理邊界情況(如播放完成后的恢復)。
- 及時釋放資源(避免內存泄漏)。
通過這張圖,可以更好地理解代碼中 avPlayer
的行為邏輯,確保播放功能穩定可靠。