|
|
|
@ -14,6 +14,7 @@ import android.widget.FrameLayout; |
|
|
|
|
|
|
|
import androidx.annotation.NonNull; |
|
|
|
|
|
|
|
import com.google.android.exoplayer2.DefaultRenderersFactory; |
|
|
|
import com.google.android.exoplayer2.ExoPlayer; |
|
|
|
import com.google.android.exoplayer2.MediaItem; |
|
|
|
import com.google.android.exoplayer2.PlaybackException; |
|
|
|
@ -61,8 +62,18 @@ public class CustomerVideoView extends FrameLayout { |
|
|
|
playerView = new StyledPlayerView(context); |
|
|
|
addView(playerView); |
|
|
|
// 2. 初始化播放器
|
|
|
|
initializePlayer(); |
|
|
|
|
|
|
|
DefaultRenderersFactory factory = |
|
|
|
new DefaultRenderersFactory(context); |
|
|
|
factory.setEnableDecoderFallback(true); |
|
|
|
player = new SimpleExoPlayer.Builder(context, factory) |
|
|
|
.setTrackSelector(new DefaultTrackSelector(context)) |
|
|
|
.build(); |
|
|
|
player.setPlayWhenReady(false); |
|
|
|
// 设置播放器到 PlayerView
|
|
|
|
playerView.setPlayer(player); |
|
|
|
setupPlayerListeners(); |
|
|
|
// 默认设置(可以根据需要调整)
|
|
|
|
playerView.setUseController(false); |
|
|
|
// 透明设置
|
|
|
|
playerView.setBackgroundColor(Color.TRANSPARENT); |
|
|
|
playerView.setShutterBackgroundColor(Color.TRANSPARENT); |
|
|
|
@ -70,56 +81,6 @@ public class CustomerVideoView extends FrameLayout { |
|
|
|
playerView.setDefaultArtwork(null); |
|
|
|
// 增加拉伸铺满
|
|
|
|
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL); |
|
|
|
replaceSurfaceWithTextureView(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 安全替换 SurfaceView 为 TextureView |
|
|
|
*/ |
|
|
|
private void replaceSurfaceWithTextureView() { |
|
|
|
if (playerView == null) return; |
|
|
|
|
|
|
|
// 延迟获取,确保 View 已创建
|
|
|
|
playerView.post(() -> { |
|
|
|
View videoView = playerView.getVideoSurfaceView(); |
|
|
|
if (!(videoView instanceof SurfaceView)) return; |
|
|
|
|
|
|
|
SurfaceView oldSurface = (SurfaceView) videoView; |
|
|
|
ViewGroup parent = (ViewGroup) oldSurface.getParent(); |
|
|
|
if (parent == null) return; |
|
|
|
|
|
|
|
// 创建 TextureView
|
|
|
|
mTextureView = new TextureView(getContext()); |
|
|
|
mTextureView.setLayoutParams(oldSurface.getLayoutParams()); |
|
|
|
|
|
|
|
// 替换
|
|
|
|
int index = parent.indexOfChild(oldSurface); |
|
|
|
parent.removeView(oldSurface); |
|
|
|
parent.addView(mTextureView, index); |
|
|
|
|
|
|
|
// 绑定到播放器
|
|
|
|
if (player != null) { |
|
|
|
player.setVideoTextureView(mTextureView); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private void initializePlayer() { |
|
|
|
// 创建 ExoPlayer 实例
|
|
|
|
player = new SimpleExoPlayer.Builder(getContext()) |
|
|
|
.setTrackSelector(new DefaultTrackSelector(getContext())) |
|
|
|
.build(); |
|
|
|
player.setPlayWhenReady(false); |
|
|
|
// 设置播放器到 PlayerView
|
|
|
|
playerView.setPlayer(player); |
|
|
|
setupPlayerListeners(); |
|
|
|
// 拉伸铺满
|
|
|
|
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL); |
|
|
|
// 默认设置(可以根据需要调整)
|
|
|
|
playerView.setUseController(false); |
|
|
|
// 默认设置 Surface 在底部
|
|
|
|
// setZOrderOnTop(false);
|
|
|
|
//setZOrderMediaOverlay(false);
|
|
|
|
} |
|
|
|
|
|
|
|
private void setupPlayerListeners() { |
|
|
|
|