我正在我的应用程序中使用画中画模式。事实上,它工作得很好,但我遇到了视频闪烁/消失一瞬间的问题。
我在“全屏”/正常模式下有 VideoActivity。我正在打电话enterPictureInPictureMode();
并且Activity
正在崩溃到小画中画框架。在动画结束缩小布局的那一刻,视频在一瞬间/一帧内变得透明。同样在这个框架中,整个画中画框架在(海拔)下得到阴影。当我触摸这个小画中画框时,它会稍微扩展为大画中画框(不是全屏),并且这个动画很流畅,但是当自动折叠到小画中画框时,它最后会再次闪烁......每次Activity
动画时到小画中画框(无论是从大画中画框还是从全屏折叠Activity
)在达到最终“小范围”时会发生一帧透明度闪烁。对声音没有影响,视频播放稳定,没有来电onPlayerStateChanged
。
使用较新的 API 版本,我们可以创建带边界的动画,这就是我知道视频视图闪烁的方式......使用无属性方法会使整个布局崩溃,我只能在具有视频/播放器/表面视图的区域看到闪烁(黑色条纹上面和下面的视频)。当我使用较新的方法时,setSourceRectHint
我可以看到整个画中画框架消失了,而不考虑其父级的黑色背景。事实上,我已经添加View
了具有固定大小、背景颜色centerInParent
等的虚拟对象 - 当放置在(父级中的第一个)层下方PlayerView
时,它会闪烁/隐藏,就像播放器一样,但放置在上面时根本不会闪烁,并且即使它显示在上面消失一秒钟。PlayerView
PlayerView
如何修复该闪烁或设置黑色背景,而不是透明...
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进入全屏时,也会出现上述问题。但在这种情况下,眨眼显示WebView
s 内容的瞬间
编辑:我刚刚找到了闪烁 ExoPlayer 的解决方法 - 通过替换SurfaceView
为TextureView
,添加app:surface_type="texture_view"
- 但我读到TextureView
的效率有点低,而且这也不是修复VideoView
闪烁(全屏来自WebView
)
edit2:可以在 Android 8(小米)和 9(Pixel)上确认闪烁