6

我正在我的应用程序中使用画中画模式。事实上,它工作得很好,但我遇到了视频闪烁/消失一瞬间的问题。

我在“全屏”/正常模式下有 VideoActivity。我正在打电话enterPictureInPictureMode();并且Activity正在崩溃到小画中画框架。在动画结束缩小布局的那一刻,视频在一瞬间/一帧内变得透明。同样在这个框架中,整个画中画框架在(海拔)下得到阴影。当我触摸这个小画中画框时,它会稍微扩展为大画中画框(不是全屏),并且这个动画很流畅,但是当自动折叠到小画中画框时,它最后会再次闪烁......每次Activity动画时到小画中画框(无论是从大画中画框还是从全屏折叠Activity)在达到最终“小范围”时会发生一帧透明度闪烁。对声音没有影响,视频播放稳定,没有来电onPlayerStateChanged

使用较新的 API 版本,我们可以创建带边界的动画,这就是我知道视频视图闪烁的方式......使用无属性方法会使整个布局崩溃,我只能在具有视频/播放器/表面视图的区域看到闪烁(黑色条纹上面和下面的视频)。当我使用较新的方法时,setSourceRectHint我可以看到整个画中画框架消失了,而不考虑其父级的黑色背景。事实上,我已经添加View了具有固定大小、背景颜色centerInParent等的虚拟对象 - 当放置(父级中的第一个)层下方PlayerView时,它会闪烁/隐藏,就像播放器一样,但放置在上面时根本不会闪烁,并且即使它显示在上面消失一秒钟。PlayerViewPlayerView

如何修复该闪烁或设置黑色背景,而不是透明...

if (Build.VERSION.SDK_INT >= 26) {
    Rect bounds = new Rect();
    playerView.getVideoSurfaceView().getDrawingRect(bounds);
    int toTop = (playerView.getMeasuredHeight() - bounds.height()) / 2,
        toLeft = (playerView.getMeasuredWidth() - bounds.width()) / 2;
    bounds.top += toTop;
    bounds.left += toLeft;
    bounds.bottom += toTop;
    bounds.right += toLeft;
    enterPictureInPictureMode(new PictureInPictureParams.Builder().
        setSourceRectHint(bounds).
        setAspectRatio(new Rational(bounds.width(), bounds.height())).
        build());
} else
    enterPictureInPictureMode();

xml:

<RelativeLayout    
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black">

<com.google.android.exoplayer2.ui.PlayerView
    android:id="@+id/activity_video_player_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    android:background="@android:color/black"
    app:controller_layout_id="@layout/exo_custom_control_view"
    app:fastforward_increment="10000"
    app:rewind_increment="10000"
    app:show_timeout="100" />
    ...

PS。当使用通常VideoView播放WebView并通过VideoEnabledWebChromeClient进入全屏时,也会出现上述问题。但在这种情况下,眨眼显示WebViews 内容的瞬间

编辑:我刚刚找到了闪烁 ExoPlayer 的解决方法 - 通过替换SurfaceViewTextureView,添加app:surface_type="texture_view"- 但我读到TextureView的效率有点低,而且这也不是修复VideoView闪烁(全屏来自WebView

edit2:可以在 Android 8(小米)和 9(Pixel)上确认闪烁

4

0 回答 0