迫于无奈_ 2026-01-24 23:26 采纳率: 25%
浏览 3

GsyVideoPlayer全屏暂停返回竖屏黑屏

GsyVideoPlayer全屏暂停返回竖屏黑屏,v11.3.0 ijk exo ali内核都一样,系统内核偶尔正常,是很根据进度条自动触发才会出现,手动暂停并回到竖屏没有这个问题,黑屏后拖动进度条可以显示画面,但是不播放,点击播放按钮也没反应,有遇到过的吗?该改过布局,但没改基本功能以及核心功能,使用GsyVideoPlayer自身StandardGSYVideoPlayer也一样

setGSYVideoProgressListener(new GSYVideoProgressListener() {
                    @Override
                    public void onProgress(long progress, long secProgress, long currentPosition, long duration) {
                        int position = (int) TimeUnit.MILLISECONDS.toSeconds(currentPosition);
                        if (position >= 300) {
//暂停
                            detailPlayer.onVideoPause();
//如果是全屏就退出全屏
                            if (orientationUtils.getScreenType() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
                                orientationUtils.resolveByClick();
                                detailPlayer.onBackFullscreen();
                            }
                        }
                    }
                })

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-24 23:27
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你提到的问题是关于 GsyVideoPlayer v11.3.0 在全屏播放时,暂停后返回竖屏出现黑屏 的情况。这种现象在 ijk、exo、ali 内核 中都存在,且部分情况下正常,但偶尔黑屏,拖动进度条可以显示画面但不播放,点击播放按钮也无反应。


    一、问题分析

    这个问题的核心原因在于:

    • 全屏切换与播放状态的同步问题:在某些设备或系统版本上,GsyVideoPlayer 在切换回竖屏时,可能没有正确恢复播放器的状态。
    • 播放器生命周期管理问题:当从全屏切换到竖屏时,可能触发了 onPause()onStop(),导致播放器被意外停止,但未重新启动。
    • 监听器逻辑问题:你目前的 setGSYVideoProgressListener 可能触发了 onVideoPause(),但这并不等同于真正的“暂停”操作,可能导致播放器状态混乱。

    二、解决方案(重点加粗)

    1. 避免在进度监听中直接调用 onVideoPause()

    你当前的代码如下:

    setGSYVideoProgressListener(new GSYVideoProgressListener() {
        @Override
        public void onProgress(long progress, long secProgress, long currentPosition, long duration) {
            int position = (int) TimeUnit.MILLISECONDS.toSeconds(currentPosition);
            if (position >= 300) {
                detailPlayer.onVideoPause();
                ...
            }
        }
    });
    

    ⚠️ 问题点onVideoPause() 是一个模拟的暂停操作,它只是改变 UI 状态,并不会真正停止播放器,可能会导致播放器处于“假暂停”状态。

    建议修改为使用 pause() 方法,并确保播放器状态同步。

    if (position >= 300) {
        detailPlayer.pause(); // 正确的暂停方法
        if (orientationUtils.getScreenType() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
            orientationUtils.resolveByClick();
            detailPlayer.onBackFullscreen();
        }
    }
    

    2. onBackFullscreen() 之后检查播放器状态

    你可以在 onBackFullscreen() 后添加对播放器状态的判断和恢复:

    detailPlayer.onBackFullscreen();
    if (detailPlayer.isPlaying()) {
        detailPlayer.startPlayLogic(); // 强制重新开始播放
    }
    

    3. 确保 onResume()onPause() 正确处理

    ActivityFragment 中,确保 onResume()onPause() 中调用了播放器的对应方法:

    @Override
    protected void onResume() {
        super.onResume();
        detailPlayer.onResume();
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        detailPlayer.onPause();
    }
    

    4. 设置 setIsTouchWiget(false) 避免误触

    有时候,播放器在竖屏下会自动隐藏控件,导致无法点击播放按钮。你可以尝试禁用触摸控制:

    detailPlayer.setIsTouchWiget(false);
    

    5. 检查播放器是否已释放资源

    如果播放器在某个地方被提前释放(如 release() 被调用),则会导致黑屏。确保你只在 onDestroy() 中调用 release()


    三、完整修改后的代码示例

    detailPlayer.setGSYVideoProgressListener(new GSYVideoProgressListener() {
        @Override
        public void onProgress(long progress, long secProgress, long currentPosition, long duration) {
            int position = (int) TimeUnit.MILLISECONDS.toSeconds(currentPosition);
            if (position >= 300) {
                detailPlayer.pause(); // 使用 pause() 替代 onVideoPause()
                if (orientationUtils.getScreenType() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
                    orientationUtils.resolveByClick();
                    detailPlayer.onBackFullscreen();
                    if (detailPlayer.isPlaying()) {
                        detailPlayer.startPlayLogic(); // 恢复播放
                    }
                }
            }
        }
    });
    
    // 设置播放器控件不响应触摸
    detailPlayer.setIsTouchWiget(false);
    
    // 在 onResume 中恢复播放器
    @Override
    protected void onResume() {
        super.onResume();
        detailPlayer.onResume();
    }
    
    // 在 onPause 中暂停播放器
    @Override
    protected void onPause() {
        super.onPause();
        detailPlayer.onPause();
    }
    

    四、其他可能的原因及排查建议

    | 问题 | 解决方案 | |------|----------| | 播放器内核问题 | 尝试更新 GsyVideoPlayer 到最新版本(v12.x)或使用 exoplayer 作为内核 | | 系统兼容性问题 | 测试不同 Android 版本(如 Android 9/10/11)下的表现 | | 布局问题 | 确保播放器容器在竖屏下有足够空间显示视频 | | 日志跟踪 | 添加 Log.d("Gsy", "播放器状态: " + detailPlayer.isPlaying()) 来确认播放状态 |


    五、总结

    重点解决方式:

    • 不要在 onProgress 中使用 onVideoPause(),而是使用 pause()
    • onBackFullscreen() 后手动恢复播放
    • 确保 onResume()onPause() 正确调用
    • 避免误触控件,设置 setIsTouchWiget(false)

    如果你仍然遇到问题,建议你提供具体的 Android 版本、设备型号、GsyVideoPlayer 版本、播放器配置代码,以便进一步定位问题。

    评论

报告相同问题?

问题事件

  • 修改了问题 1月24日
  • 创建了问题 1月24日