MediaPlayer

news2024/11/28 0:51:41

1、概念

MediaPlayer是Android原生的多媒体播放器,可以用它来实现本地或者在线音视频的播放。

2、MediaPlayer的状态

下面的图是官方给出的状态转换图,也可易理解为MediaPlayer的生命周期。

  • 椭圆形:表示MediaPlayer的状态;
  • 弧形:表示驱动对象状态转换的控制操作,有两种类型的弧,具有单箭头的弧表示同步方法调用,而具有双箭头的弧表示异步方法调用。

MediaPlayer的状态转换.png

MediaPlayer状态转换说明:

  • Idle状态:当新建对象或者在对象创建之后调用reset()时,MediaPlayer对象处于Idle状态。

  • End状态:Idle状态下,调用方法release()会直接进入End状态。MediaPlayer对象处于End状态,就无法再使用它,也无法将其恢复为其他任何状态。

生命周期开始 : 进入 Idle (闲置) 状态;
生命周期结束 : 进入 End (结束) 状态;

  • Initialized状态:Idle状态下,调用setDataSource()设置视频资源,正常情况下MediaPlayer对象会进入Initialized状态。如果调用setDataSource()方法的时候,MediaPlayer对象不是处于Idle状态就会抛出异常IllegalStateException。

  • Error状态:如果设置了回调setOnErrorListener(),此时遇到音频/视频格式不支持的,分辨率太高,流式传输超时等问题时,会回调onError()方法,此时进入Error状态。可以使用 reset() 方法进入Idle 状态。

  • Prepared状态:Initialized状态下,调用prepared()方法或preparedAsync()方法进入Prepared状态。prepared()方法直接进入Parpared状态,preparedAsync()方法是异步执行,会先进入Preparing状态,播放引擎准备完毕后会通过OnPreparedListener.onPrepared()回调方法通知进入Prepared状态。
    只有在 Initialized状态下才能调用 prepare() 和 prepareAsync()方法, 在其它状态下调用就会抛出异常IllegalStateException。

创建 MediaPlayer : 通过 new MediaPlayer() 创建的对象处于Idle (闲置) 状态;
重载 MediaPlayer : 通过 create() 方法创建的 MediaPlayer 对象处于Prepare (准备) 状态;
因此使用create() 方法创建后不需要在调用prepared()方法或preparedAsync()方法,否则会报错。

  • Started状态:Prepared状态下,调用start()方法进入Started()状态。isPlaying()可以测试MediaPlayer对象是否处于Started状态。在Started状态时,可以通过setOnBufferingUpdateListener()在其OnBufferingUpdateListener.onBufferingUpdate()回调中对流播放缓冲的状态进行追踪,可以做加载进度显示。

  • Pause状态:Started状态下,调用 pause()暂停,MediaPlayer对象将进入Pause状态。调用start()方法重新进入Started状态,继续播放。pause()和start()方法是成对的。

  • Stopped状态:在Started状态时,调用stop()方法会使MdiaPlayer从Started、Paused、Prepared、PlaybackCompleted等状态进入到Stoped状态,播放停止。处于Stopped状态,就无法开始播放,直到调用prepare()或prepareAsync()将MediaPlayer对象重新设置为Prepared状态。

  • PlaybackCompleted状态:当视频播放完成之后,如果设置setLooping()为false,并且设置了回调setOnCompletionListener(),会执行OnCompletion.onCompletion()方法,在回调后进入PlaybackCompleted状态。在此状态里可以调用start()方法重新进入Started状态。
    如果设置setLooping()为true,开启了循环模式,播放完毕之后MediaPlayer会重新进入Started状态。

3、MediaPlayer回调接口

  • OnBufferingUpdateListener
    该接口的作用是在流媒体缓冲状态发生改变的时候回调,percent表示已经缓冲了的或者播放了的媒体流百分比。
mPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        mBufferPercentage = percent;
    }
}
  • OnCompletionListener
    在媒体流播放完毕之后回调。可以在该回调中设置播放下一个视频文件。
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
     @Override
    public void onCompletion(MediaPlayer mp) {        
    }
}
  • OnErrorListener
    在异步操作中出现错误时会回调该方法, 其它情况下出现错误时直接抛出异常。
    what:出现的错误类型。
    extra:针对与具体错误的附加码, 用于定位错误更详细信息。
mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        return false;
    }
}
  • OnInfoListener
    该方法在媒体播放时出现信息或者警告时回调该方法。
    what:信息或者警告的类型。
    extra:信息或者警告的附加码,关于警告更详细信息。
mGamePlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        return false;
    }
}
  • OnPreparedListener
    该方法在进入Prepared状态并开始播放的时候回调。
mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        //这里可以调用start()方法开始播放视频      
        mPlayer.start(); 
    }
}
  • OnSeekCompleteListener
    查找操作完成的时候回调该方法。
mPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
    @Override
    public void onSeekComplete(MediaPlayer mediaPlayer) {
    }
}
  • OnVideSizeChangedListener
    当视频大小首次加载的时候及视频大小更新时回调该方法,如果没有视频返回0。
mPlayer.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
    @Override
    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {        
    }
}

4、MediaPlayer常用函数

  • seekTo()
    调整播放位置可以通过seekTo()方法,由于seekTo()是异步的,实际上查找需要一定时间才能完成,实际的查找位置完成时会走setOnSeekCompleteListener()的OnSeekComplete.onSeekComplete()回调。
    seekTo()在Prepared,Paused和PlaybackCompleted 状态下执行仍然会保持当前的状态。

  • setDataSource():设置数据源,正常调用后会进入Initialized状态。

  • setAudioStreamType():设置音频流类型,设置方式如下。

mGamePlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
  • setDisplay(): 设置播放视频的SurfaceHolder,设置方式如下,使用SurfaceView播放的时候使用该方法。
SurfaceView surfaceView = findViewById(R.id.surfaceView);
SurfaceHolder surfaceHolder = surfaceView.getHolder()
mPlayer.setDisplay(surfaceHolder);
  • setSurface(): 设置播放视频的Surface,设置方式如下,需要在SurfaceTexture准备就绪onSurfaceTextureAvailable回调的时候设置,使用TextureView播放的时候使用该方法。
mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        // SurfaceTexture准备就绪
        mPlayer.setSurface(new Surface(surface));
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
        // SurfaceTexture缓冲大小变化
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        // SurfaceTexture即将被销毁
        return false;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        // SurfaceTexture通过updateImage更新
    }
});
  • setVolume(): 设置音量。

  • getCurrentPosition():获取当前播放器播放的位置,返回值是已经播放了的毫秒数。

  • getDuration():获取文件的播放时长 (毫秒),如果没有可用的时长,就会返回 -1。

参考文章:
用MediaPlayer+TextureView封装一个完美实现全屏、小窗口的视频播放器
MediaPlayer+TextureView实现视频播放器
【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1146260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频下载软件 Downie4 mac中文介绍

Downie mac是一款Mac平台上非常实用的视频下载工具。它支持下载各种视频网站上的视频,并且具有快速、稳定、易于使用的特点。 Downie支持下载各种视频网站上的视频,包括YouTube、Vimeo、Netflix、Hulu、Amazon等等。它具有快速、稳定的下载速度&#xff…

【PWN · heap | Off-By-One】Asis CTF 2016 b00ks

萌新进度太慢了,才真正开始heap,还是从简单的Off-By-One开始吧 前言 步入堆的学习。堆的知识复杂而多,于是想着由wiki从简单部分逐个啃。 b00ks是经典的堆上off-by-one漏洞题目。刚开始看很懵(因为确实连堆的管理机制都没有完全…

为什么多线程会带来性能问题?

为什么多线程会带来性能问题? 什么是性能问题 在上一篇中,我们已经学习了多线程带来的线程安全问题,但对于多线程而言,它不仅可能会带来线程安全问题,还有可能会带来性能问题,也许你会奇怪,我…

C生万物 | 从浅入深理解指针【第二部分】

C生万物 | 从浅入深理解指针【第二部分】 前言: 如果没有看过第一部分的话,推荐先看第一部分,然后再来看第二部分~~ 文章目录 C生万物 | 从浅入深理解指针【第二部分】前言:1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的…

很多年前负责的BPO业务

业务最多的时候大约有120人左右,后来这个部门就去掉了。只留了4个领导。原因是俺开发了一些系统,替代了这个部门的人工。 当时的一些文档 ,现在还保留着。 数据安全最重要:严格控制网络安全漏洞,防止业务数据泄密。为…

4.3 视图机制

4.3 视图机制的笔记整理: 视图的作用: 数据隔离:为不同的用户提供不同的数据视图,从而限制数据对象的可见范围。安全保护:通过视图隐藏敏感或保密的数据,使无权存取的用户无法直接看到这些数据,…

ruoyi vue前后端分离功能介绍

文章目录 内置功能:用户管理:部门管理:岗位管理:菜单管理:角色管理:字典管理:参数管理: 可以设置是否开启验证码功能通知公告:操作日志:登录日志:在线用户&am…

redis学习03

Redis持久化 RDB(Redis DataBase) RDB(Redis 数据库):RDB 持久性以指定的时间间隔执行数据集的时间点快照。   实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上&#xff…

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果…

【趣味随笔】盘点仿生机器人都有哪些

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

Java JVM垃圾回收确定垃圾的两种方式,GC Root

文章目录 前言一、如何确定是垃圾?引用计数法根可达路径法 二、GC Root1、以下可作为GC Root对象2、判断可回收:GC Root不可达3、真正宣告对象死亡需经过两次标记过程(重要) 前言 对于Java两种确定对象为可回收的两种方式&#x…

Cocos Creator 中使用装饰器进行自动绑定

推荐一个偷懒的方式,使用装饰器自动绑定节点到脚本的属性 背景 用 Cocos Creator 写脚本组件的时候,有时需要场景中一个节点作为这个脚本的属性值。 按照官方文档推荐的方法,需要以下两步 添加一个 property 属性,在场景中拖入这个…

基于人工蜂群算法的无人机航迹规划-附代码

基于人工蜂群算法的无人机航迹规划 文章目录 基于人工蜂群算法的无人机航迹规划1.人工蜂群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用人工蜂群算法来优化无人机航迹规划。 …

计算机网络重点概念整理-第三章 数据链路层【期末复习|考研复习】

第三章 数据链路层 【期末复习|考研复习】 计算机网络系列文章传送门: 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 第三章 数据链路层 【期末复习…

未来世界:16项改变人类社会的新技术

2016年出版的图书《未来世界:改变人类社会的新技术》,作者是美国的史蒂芬科特勒(Steven Kotler),里面是对各种前沿科技的展望,比如仿生人、机器人、飞行汽车、人工生命、生命延长、行星矿业、意识下载等。 …

前端 :用HTML , CSS ,JS 做一个秒表

1.HTML&#xff1a; <body><div id "content"><div id "top"><div id"time">00:00:000</div></div><div id "bottom"><div id "btn_start">开始</div><div …

剪辑中遮罩可分几种 剪辑遮罩视频怎么做

当你觉得剪辑特效很难制作的时候&#xff0c;不妨阅读一下本文&#xff0c;来了解遮罩的原理和用法。它是一种超级剪辑工具&#xff0c;可以制作出各种神奇的画面效果。在了解遮罩的基本原理后&#xff0c;就连初学者也能轻松地制作出令人惊艳的剪辑遮罩。有关剪辑中遮罩可分几…

搞懂 MySql 的架构和执行流程

搞懂 MySql 的架构和执行流程 1、MySQL 的三层架构2、SQL 的执行流程2.1、连接器2.2、解析器2.3、预处理器2.4、优化器2.5、执行器2.6、存储引擎 3、关于Select 的两个顺序 1、MySQL 的三层架构 MySQL的三层结构包括&#xff1a; 连接层&#xff1a;负责与MySQL客户端之间的通…

ChatGPT从入门到精通

目录 什么是ChatGPT&#xff1f;ChatGPT能帮我干什么&#xff1f;标题在哪里可以使用ChatGPT&#xff1f;什么是ILoveChatGPT&#xff08;IMYAI&#xff09;&#xff1f;标题如何拥有头像&#xff1f;如何获取更多对话次数&#xff1f;!标题如何提问GPT&#xff1f;如何正确地利…

【C++的OpenCV】第十四课-OpenCV基础强化(二):访问单通道Mat中的值

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496;&#x1f496;&…