Android音视频技术之MediaPlayer视频窗口尺寸适配

2023-05-16

作者:JulyYu

前言

使用MediaPlayer播放能力后再视频播放上还有一个问题需要解决,那就是适配尺寸适配。默认情况使用SurfaceView播放视频可能会出现视频被拉伸或是压缩的情况。

MediaPlayer内部方案

视频资源信息如下所示,视频尺寸为1080x606,正常播放情况是宽大于高展示。

正常播放

视频信息

MediaPlayer内部支持视频播放尺寸设置:VIDEO_SCALING_MODE_SCALE_TO_FITVIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING,通过setVideoScalingMode方法进行设置。两种方式展示形式如下图所示。

VIDEO_SCALING_MODE_SCALE_TO_FIT

VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING

但实际效果上展示并为达到预期效果,要实现预先的尺寸适配还是要去修改窗口尺寸才行。

适配方案

在适配方案上的算法设计应该是视频宽高的某一边撑满屏幕(因为其他情况暂时不考虑),预设上先以屏幕尺寸作为基准来实现。这里也先以屏幕竖屏为例,横屏情况其实也是相同方案。

预先设计以屏幕竖屏需要撑满宽,计算屏幕宽高比,获取到视频尺寸后利用屏幕宽高比。以屏幕的宽为视频尺寸缩放后的宽,然后计算出视频尺寸缩放后的高。最终计算出来的尺寸并是SurfaceView视图窗口大小这样就能够保证播放视频尺寸被拉伸的问题了。

代码部分

视频尺寸信息可以在MediaPlayer加载视频资源准备结束后获取到。还记得之前提到通过getTrackInfo()无法获取到视频尺寸,也不需要通过MediaExtractor来实现,其实可以直接通过MediaPlayer准备就绪后获取到视频信息。

 @Override
    public void onPrepared(MediaPlayer mp) {
        playerInfo.playerStatus = PREPARED;
        //获取到的资源不够查询详细数据
        int width = mp.getVideoWidth();
        int height = mp.getVideoHeight();
        playerInfo.videoSize = new Size(width,height);
        callbackInfo(playerInfo);
    }

在资源准备就绪后在回调中获取到屏幕尺寸,然后算法计算出窗口大小从而实现视频尺寸适配。

@Override
public void onPlayerInfoCallBack(AndroidMediaPlayer.PlayerInfo playerInfo) {
    if(playerInfo.getPlayerStatus() == AndroidMediaPlayer.PREPARED){
        //屏幕比例
        Size size = ScreenUtils.getScreenSize(TestSimpleMediaPlayerActivity.this);
        //以宽为主
        Size videoSize = playerInfo.getVideoSize();
        //视频比例
        float videoRatio = videoSize.getWidth() / (float)videoSize.getHeight();
        float newHeight = size.getWidth() / videoRatio;
        LinearLayout.LayoutParams layoutParams =(LinearLayout.LayoutParams) surfaceView.getLayoutParams();
        layoutParams.height = (int)newHeight;
        // 重新设置窗口尺寸高
        surfaceView.setLayoutParams(layoutParams);
        androidMediaPlayer.start();
    }
}

总结

事实上视频播放窗口尺寸设置通过改变最终播放窗口尺寸即可。当然可以不根据屏幕尺寸作为基准来适配窗口大小,例如SurfaceView外部布局窗口是个正方形等也是能够实现但展示效果上或许不太好看。其次若要视频尺寸内部缩放裁剪等(16:9、3:4)那可能就需要其他方案实现了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android音视频技术之MediaPlayer视频窗口尺寸适配 的相关文章

随机推荐

  • 无用的知识--定时提醒(go语言小工具)

    遇到喜欢的事情总是欲罢不能 xff0c 一不小心就酿成了打错 xff0c 比如说在B站上学习 xff08 卷 xff09 过度 xff0c 错过了重要的事情 不用担心 xff0c 今天分享go语言写一个windows系统中定时提醒小工具 p
  • 重装Office后打开Powerpoint和excel提示找不到VCRUNTIME140_1.dll的解决办法(亲测成功,简单有效)

    1 下载VCRUNTIME140 1 dll xff08 可搜索下载途径 xff09 2 将其复制到OFFICE安装目录 xff0c 如下 C Program Files Microsoft Office16 3 再次打开即成功 xff01
  • ERROR:zygote_host_。。。。。Running as root without --no-sandbox is not supported.

    安装好google后 xff0c 在命令行输入google chrome后出现 xff0c ERROR zygote host impl linux cc 89 Running as root without no sandbox is n
  • 【IOT开发】蓝牙模块与PC连接通讯实验

    这是在一个项目中 xff0c 需要开发 windows APP xff0c 通过蓝牙与下位机通讯 之前接触过的一些蓝牙项目 xff0c 大多是 模块与模块 通讯 xff0c 也见过很多模块 手机通讯的教程 xff0c 但PC端直接与蓝牙模块
  • Linux安装JDK详细教程(附图)

    Linux安装JDK详细教程 xff08 图文教程 xff09 这里介绍两种方式 xff1a yum安装方式和手动安装 1 yum安装 1 1 查看JDK版本 xff0c 找到你想要安装的JDK版本 xff0c 这里以 JDK1 8 为例
  • AD布线后批量改线宽

    最近在学习AD画板 xff0c 打算布线结束后再改线宽 xff0c 遇到了一些问题 xff0c 经过网上的资料已经解决 首先 xff0c 右键空白处 xff0c 选择第一个 查找相似对象 然后用十字标选择想要更改的线 在弹出的框中更改 NE
  • 使用springboot启动类报错: 找不到或无法加载主类怎么解决?

    出现问题的原因是 xff1a 在使用springboot启动类时 xff0c 并没有写错代码和注解 xff0c 然后它还是报错找不或无法加载主类 解决此问题的办法 就是 xff0c 重新在项目结构中的Modules吧项目移除再次加载进了即可
  • 【iOS】---pthread,NSThread

    在iOS中多线程开发有四种方式 xff0c 在之前我们浅浅了解了一下GCD xff0c 这期来看看pthread和NSThread pehread pthread简介 pthread 是一套通用的多线程的 API xff0c 可以在Unix
  • 如何关闭windows11 Defender防火墙

    windows Defender是windows系统自带的防火墙 xff0c 但是由于它太过于敏感 xff0c 导致很多软件 xff0c 程序被误杀 一般默认开启时 xff0c Denfender防火墙拦截时会弹出提示 下面教大家如何关闭w
  • C++友元类和友元函数

    特点 xff1a 能访问私有成员 破坏封装性 友元关系不可传递 若B是A的友元 xff0c C是B的友元 xff0c 但C不一定是A的友元 xff0c 要看类中是否有申明 友元关系的单向性 若A是B的友元 xff0c 但B不一定是A的友元
  • windows和Ubuntu(linux操作系统)之间如何进行文件互传

    Windows和Ubuntu下的Linux操作系统之间的文件互传需要用到应用层的FTP协议 xff08 文件传输协议 xff09 xff0c 设置方法如下 xff1a 1 xff1a 打开Ubuntu下的Linux操作系统的FTP服务 打开
  • 有网但浏览器不显示网页如何解决

    如果网络没有问题 xff0c 但是浏览器显示不了网页 xff0c 首先考虑是不是DNS出了问题 xff0c 导致域名解析失败 如何解决呢 xff1f 1 打开控制面板 xff0c 打开所有控制面板 找到网络和共享中心 2 找到Interne
  • pycharm下的vc2没有代码提示(不用改文件)

    我第一次遇到cv2没有代码提示的时候也是一脸懵逼 xff0c 在网上搜索了各种解决办法 包括但不限于修改 init py文件 xff0c 复制文件 xff0c 降低opencv的版本等 xff0c 都没有用 但是最后还是参考网上建议以及自己
  • delete和delete[]的区别

    对于简单类型 简单类型像 int char int long struct等 由于对象是没有析构函数的 所以delete和delete 是一样的 int arr 61 new int 10 delete arr delete arr 两种方
  • Result Maps collection already contains value for…BaseResultMap

    异常信息 Result Maps collection already contains value for BaseResultMap 假如使用generatorSqlmapCustom逆向工程生成代码 xff0c 即生成dao文件和ma
  • Debian 11 软件最大化占不满屏幕

    原来是自己不知何时手长把 Workspace margin 给设置了 xff0c 导致软件最大会占不满全屏 就是设置 gt Workspace gt margins 把 17 改成 0 就好了 曾一度难受的想重装系统 xff0c 原来是这么
  • static静态成员

    静态成员包括 xff1a 静态成员变量和静态成员函数 一 静态成员变量 静态成员变量的特点 所有对象都共享一份数据 编译阶段就分配内存 只能在类内声明 xff0c 类外初始化 静态成员变量也是有访问权限的 1 验证 所有对象都共享一份数据
  • matlab如何删除矩阵某行或列?

    要删除矩阵某一行或某一列 xff0c 只需要将某一行或某一列赋予一个空矩阵即可 例如 xff1a clc clear close all x 61 eye 4 先创建一个4 4矩阵 xff1a x 61 eye 4 xff0c 得到 之后输
  • Excel导出 POI 响应头设置 Content-Type: application/vnd.ms-excel 异常解决方法

    386条消息 Excel导出 POI 响应头设置 Content Type application vnd ms excel 异常解决方法 刘涛 的博客 CSDN博客 application vnd ms excel charset 61
  • Android音视频技术之MediaPlayer视频窗口尺寸适配

    作者 xff1a JulyYu 前言 使用MediaPlayer播放能力后再视频播放上还有一个问题需要解决 xff0c 那就是适配尺寸适配 默认情况使用SurfaceView播放视频可能会出现视频被拉伸或是压缩的情况 MediaPlayer