当前位置: 首页 > news >正文

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{@Overridepublic 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);}
}
http://www.lryc.cn/news/460303.html

相关文章:

  • 【RS】GEE(Python):数据处理
  • 非线性磁链观测器推导
  • 什么时机用mysql,什么时机用redis,什么时机用本地内存
  • Redis八股
  • vue3--通用 popover 气泡卡片组件实现
  • Bluetooth Channel Sounding中关于CS Step及Phase Based Ranging相应Mode介绍
  • 简易STL实现 | Queue 的实现
  • 【hot100-java】LRU 缓存
  • Centos7安装ZLMediaKit
  • 面试问我LLM中的RAG,咱就是说秒过!!!
  • python程序操作pdf
  • 【Python报错】ImportError: DLL load failed while importing _network: 找不到指定的模块。
  • 外包干了5天,技术明显退步
  • 正则表达式 | Python、Julia 和 Shell 语法详解
  • JavaScript全面指南(一)
  • docker-compose与docker
  • DDPM浅析
  • 力扣刷题-算法基础
  • 理解 Python 中的 Hooks 和装饰器
  • Android 原生程序使用gdb, addr2line, readelf调试
  • PHP 函数 func_num_args() 的作用
  • 深入解析单片机原理及其物联网应用:附C#示例代码
  • HTTP 和 WebSocket
  • 科技云报到:大模型时代下,向量数据库的野望
  • 贪吃蛇游戏(代码篇)
  • 数控走心机系统可以定制吗
  • PHP实现OID(Object identifier)的编码和解码
  • 架构设计笔记-12-信息系统架构设计理论与实践
  • 【Power Compiler手册】15.多角多模式设计中的功耗优化
  • 关于HalconDeeplearn中的语义分割的实现