一般对于一个播放器,应该支持如下几种显示模式:

  • 等比例,最大化区域显示,不裁剪
  • 等比例,最大区域显示,裁剪
  • 拉伸显示,铺满全屏

要实现这几种显示模式,其实只要对播放控件的布局进行些许调整即可.那EasyPlayer是怎么实现的呢?

EasyPlayer使用一个PlayFragment进行视频播放.该类实现了一个setScaleType的方法来进行显示模式设定(或切换).

  1. public void setScaleType(@IntRange(from = ASPACT_RATIO_INSIDE, to = FILL_WINDOW) int type){
  2. mRatioType = type;
  3. if (mWidth != 0 && mHeight != 0){
  4. onVideoSizeChange();
  5. }
  6. }

这里的逻辑很简单,首先保存一下type的状态,并判断视频的宽高是否已经获取到了,如果是,则立马对view的尺寸进行计算,否则等获取到了后再计算.

其参数支持如下几种:

  1. /**
  2. * 等比例,最大化区域显示,不裁剪
  3. */
  4. public static final int ASPACT_RATIO_INSIDE = 1;
  5. /**
  6. * 等比例,裁剪,裁剪区域可以通过拖拽展示\隐藏
  7. */
  8. public static final int ASPACT_RATIO_CROPE_MATRIX = 2;
  9. /**
  10. * 等比例,最大区域显示,裁剪
  11. */
  12. public static final int ASPACT_RATIO_CENTER_CROPE = 3;
  13. /**
  14. * 拉伸显示,铺满全屏
  15. */
  16. public static final int FILL_WINDOW = 4;

我们结合代码与注释,看看onVideoSizeChange()函数主要做了什么:

  1. private void onVideoSizeChange() {
  2. // 视频尺寸未获取成功,直接返回.
  3. if (mWidth == 0 || mHeight == 0) return;
  4. if (mAttacher != null){ // 如果之前的模式是ASPACT_RATIO_CROPE_MATRIX,先释放attacher.
  5. mAttacher.cleanup();
  6. mAttacher = null;
  7. }
  8. if (mRatioType == ASPACT_RATIO_CROPE_MATRIX) {
  9. // ...
  10. // 这种情况下,需要将显示区域铺满父窗口.并使用matrix和手势进行显示控制.
  11. // 具体的控制方法,参考文章:http://blog.csdn.net/jyt0551/article/details/56063869
  12. mSurfaceView.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
  13. mSurfaceView.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
  14. // 初始化新的Attacher进行显示控制.
  15. // ...
  16. // 使用一个角度控件来显示当前的拖动角度.
  17. mAngleView.setVisibility(View.VISIBLE);
  18. }else {
  19. // 重置matrix为默认(不做显示形变)
  20. mSurfaceView.setTransform(new Matrix());
  21. mAngleView.setVisibility(View.GONE);
  22. // 分别计算出显示控件的宽高比和视频的宽高比
  23. float ratioView = getView().getWidth() * 1.0f/getView().getHeight();
  24. float ratio = mWidth * 1.0f/mHeight;
  25. switch (mRatioType){
  26. case ASPACT_RATIO_INSIDE: {
  27. if (ratioView - ratio < 0){ // 屏幕宽高比相比视频的宽高比更小.表示视频是过于宽了.
  28. // 那就以宽为基准.宽最大化
  29. mSurfaceView.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
  30. // 高进行等比例缩放
  31. mSurfaceView.getLayoutParams().height = (int) (getView().getWidth() / ratio + 0.5f);
  32. }else{ // 视频是竖屏了.
  33. // 以高为基准,高最大化
  34. mSurfaceView.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
  35. // 宽进行等比例缩放
  36. mSurfaceView.getLayoutParams().width = (int) (getView().getHeight() * ratio + 0.5f);
  37. }
  38. }
  39. break;
  40. case ASPACT_RATIO_CENTER_CROPE: {
  41. // 以更短的为基准
  42. if (ratioView - ratio < 0){ // 屏幕宽高比相比视频的宽高比更小.表示视频是过于宽了.横向裁剪
  43. // 以高为基准.高铺满全屏
  44. mSurfaceView.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
  45. // 等比例计算出横向区域..多出父控件的范围将被裁剪
  46. mSurfaceView.getLayoutParams().width = (int) (getView().getHeight() * ratio+ 0.5f);
  47. }else{ // 视频是竖屏了.
  48. // 那就以宽为基准.宽铺满屏幕
  49. mSurfaceView.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
  50. // 等比例计算出纵向区域,超出父控件的范围将被裁剪
  51. mSurfaceView.getLayoutParams().height = (int) (getView().getWidth() / ratio+ 0.5f);
  52. }
  53. }
  54. break;
  55. case FILL_WINDOW:{
  56. // 铺满父控件即可...
  57. mSurfaceView.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
  58. mSurfaceView.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
  59. }
  60. break;
  61. }
  62. }
  63. // 布局更改,刷新下.
  64. mSurfaceView.requestLayout();
  65. }

onVideoSizeChange函数,除了在手动设置显示模式的时候调用外,在成功获取到了视频宽高,或者视频宽高更改之后,也会调用.如下:

  1. if (resultCode == EasyRTSPClient.RESULT_VIDEO_DISPLAYED) {
  2. // 视频开始显示了.
  3. onVideoDisplayed();
  4. } else if (resultCode == EasyRTSPClient.RESULT_VIDEO_SIZE) {
  5. // 视频分辨率获取到,或者更改了
  6. mWidth = resultData.getInt(EasyRTSPClient.EXTRA_VIDEO_WIDTH);
  7. mHeight = resultData.getInt(EasyRTSPClient.EXTRA_VIDEO_HEIGHT);
  8. onVideoSizeChange();
  9. }

在EasyPlayer工程的demo事例里面,调用方法如下:

  1. public void onToggleAspectRatio(View view) {
  2. PlayFragment f =mRenderFragment;
  3. if (f == null) return;
  4. f.setScaleType(++i);
  5. switch (i){
  6. case PlayFragment.ASPACT_RATIO_INSIDE: {
  7. Toast.makeText(this,"等比例居中",Toast.LENGTH_SHORT).show();
  8. }
  9. break;
  10. case PlayFragment.ASPACT_RATIO_CENTER_CROPE: {
  11. Toast.makeText(this,"等比例居中裁剪视频",Toast.LENGTH_SHORT).show();
  12. }
  13. break;
  14. case PlayFragment.FILL_WINDOW:{
  15. Toast.makeText(this,"拉伸视频,铺满区域",Toast.LENGTH_SHORT).show();
  16. }
  17. break;
  18. case PlayFragment.ASPACT_RATIO_CROPE_MATRIX:{
  19. Toast.makeText(this,"等比例显示视频,可拖拽显示隐藏区域.",Toast.LENGTH_SHORT).show();
  20. }
  21. break;
  22. }
  23. if (i == PlayFragment.FILL_WINDOW){
  24. i = 0;
  25. }
  26. }

让我们看看展示效果:

关于EasyPlayer流媒体播放器

An elegant, simple, fast android RTSP/RTMP/HLS/HTTP Player.EasyPlayer support RTSP(RTP over TCP/UDP)version & Pro version,cover all kinds of streaming media!EasyPlayer是一款精炼、高效、稳定的流媒体播放器,分为RTSP版、RTMP版和Pro版三个版本,支持各种各样的流媒体音视频协议和文件的播放,在安防、互联网、教育、录播、IPTV等多个领域大放异彩,广泛应用!

EasyPlayer:https://github.com/EasyDSS/EasyPlayer

点击链接加入群【EasyPlayer】:544917793

获取更多信息

邮件:support@easydarwin.org

EasyDarwin开源流媒体服务器:www.EasyDarwin.org

EasyDSS商用流媒体解决方案:www.EasyDSS.com

EasyNVR无插件直播方案:www.EasyNVR.com

Copyright © EasyDarwin Team 2012-2017

EasyPlayer RTSP 安卓Android播放器显示模式设置方法的更多相关文章

  1. EasyPlayer RTSP安卓Android播放器架构简析

    本文转自EasyDarwin开源团队成员John的博客:http://blog.csdn.net/jyt0551/article/details/73310641 EasyPlayer 是一款小而美的 ...

  2. RTSP Windows专用播放器EasyPlayer : 稳定、兼容、高效、超低延时

    EasyPlayer RTSP Windows专用播放器 EasyPlayer RTSP Windows 播放器是由EasyDarwin团队开发和维护的一个完善的RTSP流媒体播放器项目,视频编码支持 ...

  3. github上十二款最著名的Android播放器开源项目

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

  4. GitHub上最著名的Android播放器开源项目大全

    GitHub上最著名的Android播放器开源项目大全                                                                          ...

  5. EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能

    本文转自:http://blog.csdn.net/jyt0551/article/details/56942795 对于一个裸的RTSP URL,存放在播放列表上略显单调与枯燥.大家可以看到Easy ...

  6. 【翻译】安卓新播放器EXOplayer介绍

    http://developer.android.com/guide/topics/media/exoplayer.html   前言: Playing videos and music is a p ...

  7. Android——播放器和图片轮播

    layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  8. 安卓MP3播放器开发实例(1)之音乐列表界面

    学习安卓开发有一年了,想想这一年的努力,确实也收获了不少.也找到了比較如意的工作. 今天准备分享一个以前在初学阶段练习的一个项目.通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正 ...

  9. Android播放器推荐:可以播放本地音乐、视频、在线播放音乐、视频、网络收音机等

    下载链接:http://www.eoeandroid.com/forum.php?mod=attachment&aid=MTAxNTczfGMyNjNkMzFlfDEzNzY1MzkwNTR8 ...

随机推荐

  1. Hibernate search与Lucene包异常学习心得

    最近使用了了一下Hibernate  Search这个组件 这个组件是对域模型进行全文检索,在全文检索的底层实现上使用了Lucene技术 在进行小测试的时候费了很大的力气去搞定包的问题 我直接通过实例 ...

  2. Hrbust 2363 Symmys (Manacher + DP)

    题目链接  Hrbust 2363 来源  “科林明伦杯”哈尔滨理工大学第七届程序设计团队赛 Problem J 题意  给出一个长度为$1e6$的字符串,求最小可重回文子串覆盖数量 首先Manach ...

  3. BitMap与RoaringBitmap、JavaEWAH

    本文主要介绍BitMap的算法思想,以及开源工具类JavaEWAH.RoaringBitmap的简单用法. 一.BitMap 介绍 BitMap使用bit位,来标记元素对应的Value.该算法能够节省 ...

  4. MariaDB主从复制、主主复制

    1.部署 10.0.0.21  MariaDB-21 10.0.0.22  MariaDB-22 cat /etc/yum.repos.d/mariadb.repo [mariadb] name=Ma ...

  5. j2ee性能调优之最小化资源压力测试法则

    前面看到有人讲j2ee的性能调优,虽然这块不是自己的专长,但是猪养多了,也忍不住跳出来说几句. 虽然几乎每本讲性能调优的书籍开篇都会提,没必要的情况下就不要做调优,但是我个人还是认为,所有系统在上线前 ...

  6. [java基础] 002 - 位运算符的详解和妙用

    一:位运算符详解 位运算符主要用来对操作数二进制的位进行运算.按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值. Java 语言中的位运算符分为位逻辑运算符和位移运算符两类, ...

  7. 性能调优培训 windbg --woodytu

    http://www.cnblogs.com/woodytu/p/4675479.html http://www.cnblogs.com/fjicn/p/3405716.html http://www ...

  8. 网上常用免费webservice_查询(网络复制)

    MP3在线搜索服务 地址:http://www.wopos.com/webservice/song.asmx 介绍: 使用: getMusicList()方法搜索MP3/WMA等音乐文件 多功能条形码 ...

  9. 【GLSL教程】(七)逐像素的光照 【转】

    http://blog.csdn.net/racehorse/article/details/6662540 逐像素的方向光(Directional Light per Pixel) 这一节将把前面的 ...

  10. 连接Zookeeper操作

    public class ZKConnector implements Watcher{ private static final Logger logger =LoggerFactory.getLo ...