避免暂停时video申请buffer,造成黑脸
author孙春阳 <snickersun@163.com>
Sat, 17 Jan 2026 04:09:54 +0000 (12:09 +0800)
committer孙春阳 <snickersun@163.com>
Sat, 17 Jan 2026 04:09:54 +0000 (12:09 +0800)
code/sdk/middleware/services/media/foundation/player/frameworks/player_control/player/liteplayer.cpp

index a914912..e0dcdba 100644 (file)
@@ -1316,6 +1316,12 @@ int32_t PlayerControl::QueueOutputBufferToVideoDecoder(void)
     CHECK_NULL_RETURN(sinkManager_, HI_FAILURE, "sink manager is null");
     CHECK_NULL_RETURN(videoDecoder_, HI_FAILURE, "video decoder is null");
 
+    // 0. 如果播放器已暂停,跳过请求缓冲区,避免屏幕关闭时连续失败
+    if (paused_) {
+        MEDIA_DEBUG_LOG("player is paused, skip requesting surface buffer");
+        return HI_SUCCESS;
+    }
+
     // 1. if video sink have cache, means have remain buffer not send to surface, don't need request buffer from surface
     bool haveCache = sinkManager_->HaveCacheFrame(false);
     if (haveCache) {
@@ -1330,6 +1336,11 @@ int32_t PlayerControl::QueueOutputBufferToVideoDecoder(void)
     surfaceBuf_ = LvRequestBuffer(reinterpret_cast<lv_obj_t *>(surface_), 0);
 #endif
     if (surfaceBuf_ == nullptr) {
+        // 如果播放器已暂停,不增加失败计数,直接返回成功
+        if (paused_) {
+            MEDIA_DEBUG_LOG("surface buffer request failed but player is paused, skip error count");
+            return HI_SUCCESS;
+        }
         if (continousRequestSurfaceBufferFailCount_ == MAX_CONTINOUS_REQUEST_SURFACE_BUFFER_FAIL_COUNT) {
             PalayControlEventItem item = { EVNET_VIDEO_RUNNING_ERR };
             eventQueue_.push_back(item);