ijkMediaPlayer+ TextureView 等比全屏播放视频(避免拉伸)
TextureView默认以fitxy的方式加载surface数据,如果需要等比全屏播放视频,避免拉伸,可以采用Matrix对TextureView进行变换
废话不多说,直接上代码
public class BaseIjkPlayer implements TextureView.SurfaceTextureListener{
//视频缩放,调整比例
private void resolveStretching(float textureViewWidth,float textureViewHeight){
if(textureView==null){
return;
}
if(ijkMediaPlayer==null){
return;
}
try {
float videoWidth = ijkMediaPlayer.getVideoWidth(); //宽
float videoHeight = ijkMediaPlayer.getVideoHeight(); //高
if(textureViewWidth==0||textureViewHeight==0||videoWidth==0||videoHeight==0){
return;
}
Matrix matrix = getMatrix(textureViewWidth, textureViewHeight, videoWidth, videoHeight);
textureView.setTransform(matrix);
textureView.postInvalidate();
}catch (Exception e){
Log.d(TAG, "resolveStretching: error"+e);
}
}
//获取Matrix
private @NonNull Matrix getMatrix(float textureViewWidth,float textureViewHeight,float videoWidth,float videoHeight) {
float sx = textureViewWidth / videoWidth;
float sy = textureViewHeight/ videoHeight;
Matrix matrix = new Matrix();
//第1步:把视频区移动到View区,使两者中心点重合.
matrix.preTranslate((textureViewWidth - videoWidth) / 2, (textureViewHeight - videoHeight) / 2);
//第2步:因为默认视频是fitXY的形式显示的,所以首先要缩放还原回来.
matrix.preScale(videoWidth / textureViewWidth, videoHeight / textureViewHeight);
//第3步,等比例放大或缩小,直到视频区的一边和View一边相等.如果另一边和view的一边不相等,则留下空隙
if (sx >= sy){
matrix.postScale(sy, sy, textureViewWidth / 2, textureViewHeight / 2);
}else{
matrix.postScale(sx, sx, textureViewWidth / 2, textureViewHeight / 2);
}
return matrix;
}
}
在onSurfaceTextureAvailable才能拿到textureViewWidth和textureViewHeight的真实长度
public class BaseIjkPlayer implements TextureView.SurfaceTextureListener{
@Override
public void onSurfaceTextureAvailable(@NonNull SurfaceTexture sur, int width, int height) {
this.surface = new Surface(sur);
ijkMediaPlayer.setSurface(surface);
resolveStretching(width,height);
}
//省略其他的SurfaceTextureListener的实现...
}
别忘了添加监听
public class BaseIjkPlayer implements TextureView.SurfaceTextureListener{
public IjkMediaPlayer ijkMediaPlayer;
//初始化
private void init() {
ijkMediaPlayer = new IjkMediaPlayer();
//...省略一些配置
textureView.setSurfaceTextureListener(this);
}
}
原文地址:https://blog.csdn.net/qq_32865887/article/details/142858367
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!