You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExoPlayer问题:音频正常播放但视频显示白屏如何解决?

解决ExoPlayer音频正常但视频白屏的问题

我看到你用的是ExoPlayer的旧版本(基于ExoPlayerFactory的实现),音频正常播放但视频白屏,大概率是视频轨道渲染、Surface绑定或者初始化时机的问题,下面给你几个针对性的排查和解决步骤:

1. 检查TrackSelector的视频轨道配置

你的代码里用了AdaptiveTrackSelection.Factory,但可能默认的轨道选择逻辑没有选中可用的视频轨道。可以尝试调整TrackSelector的配置:

// 替换原来的TrackSelector初始化,添加轨道信息打印,确认是否有视频轨道被选中
TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory) {
    @Override
    public void onSelectionChanged(TrackSelectionParameters parameters) {
        Log.d("ExoPlayer", "Selected tracks: " + parameters.toString());
        super.onSelectionChanged(parameters);
    }
};

另外,也可以暂时改用默认的TrackSelection工厂,先排除自适应选择的问题:

// 改用默认轨道选择工厂测试
TrackSelector trackSelector = new DefaultTrackSelector(new DefaultTrackSelection.Factory());

2. 确认SimpleExoPlayerView的Surface状态

视频白屏很多时候是Surface没有正确绑定到ExoPlayer,你可以做这些检查:

  • 确保mSimpleExoPlayerView已经在Fragment的布局中正确初始化,且调用initializePlayer的时机是在视图inflation完成后(比如在onViewCreated方法里,而不是onCreate)
  • 手动触发Surface重新绑定,修复可能的绑定异常:
mSimpleExoPlayerView.setPlayer(null);
mSimpleExoPlayerView.setPlayer(mExoPlayer);
  • 检查布局中SimpleExoPlayerView的尺寸设置,确保它有可见的大小(比如设置match_parent或固定宽高),避免Surface尺寸为0导致白屏

3. 监听播放错误与视频轨道状态

添加Player监听器,获取视频渲染的错误信息或轨道加载状态,帮助定位问题:

mExoPlayer.addListener(new Player.EventListener() {
    @Override
    public void onPlayerError(ExoPlaybackException error) {
        Log.e("ExoPlayerError", "Playback error: " + error.getMessage());
        // 这里可以查看具体错误原因,比如解码器初始化失败
    }

    @Override
    public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) {
        Log.d("ExoPlayerVideo", "Video size changed: " + width + "x" + height);
        // 如果这个回调没触发,说明视频轨道未被正确加载
    }
});

4. 调整播放器初始化与释放的生命周期时机

确保在Fragment的合适生命周期方法中初始化和释放播放器,避免视图未就绪就初始化:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mSimpleExoPlayerView = view.findViewById(R.id.your_player_view_id);
    // 在这里获取视频Uri并初始化播放器
    Uri mediaUri = ...;
    initializePlayer(mediaUri);
}

// 记得在视图销毁时释放播放器,避免内存泄漏和资源占用
@Override
public void onDestroyView() {
    super.onDestroyView();
    if (mExoPlayer != null) {
        mExoPlayer.release();
        mExoPlayer = null;
    }
}

5. 临时禁用硬件加速排查兼容性问题

部分设备的硬件解码器可能存在兼容性问题,你可以尝试禁用硬件加速测试:

<!-- 在布局中给SimpleExoPlayerView添加禁用硬件加速的属性 -->
<com.google.android.exoplayer2.ui.SimpleExoPlayerView
    android:id="@+id/player_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:hardwareAccelerated="false"/>

或者在代码中设置:

mSimpleExoPlayerView.setUseHardwareDecoder(false);

你可以按照上面的步骤逐一排查,大概率能找到问题的根源。

内容的提问来源于stack exchange,提问作者Pritam Tirpude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:27:22