在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容。也知道VideoView内部封装的就是MediaPlayer,本文就介绍如何使用MediaPlayer播放视频。

一、简介

MediaPlayer是Android中的一个多媒体播放类,其提供的API能满足简单的大部分音视频的播放需求。

下面简单介绍一下MediaPlayer:

  • MediaPlayer是使用Surface进行视频的展示的。
  • MediaPlayer只支持mp4、avi、3gp格式的视频,支持格式相对单一。
  • MediaPlayer可以播放网络视频,支持的网络视频的协议为:Http协议和RTSP协议两种。

二、MediaPlayer 使用方法

MediaPlayer 的提供的方法如下:

  • void setDataSource(String path) :通过一个具体的路径来设置MediaPlayer的数据源,path可以是本地的一个路径,也可以是一个网络路径
  • void setDataSource(Context context, Uri uri): 通过给定的Uri来设置MediaPlayer的数据源,这里的Uri可以是网络路径或是一个ContentProvider的Uri。
  • void setDataSource(MediaDataSource dataSource) :通过提供的MediaDataSource来设置数据源
  • void setDataSource(FileDescriptor fd): 通过文件描述符FileDescriptor来设置数据源
  • int getCurrentPosition() :获取当前播放的位置
  • int getAudioSessionId() :返回音频的session ID
  • int getDuration() :得到文件的时间
  • TrackInfo[] getTrackInfo() :返回一个track信息的数组
  • boolean isLooping (): 是否循环播放
  • boolean isPlaying(): 是否正在播放
  • void pause () :暂停
  • void start () :开始
  • void stop () : 停止
  • void prepare(): 同步的方式装载流媒体文件。
  • void prepareAsync(): 异步的方式装载流媒体文件。
  • void reset(): 重置MediaPlayer至未初始化状态。
  • void release (): 回收流媒体资源。
  • void seekTo(int msec): 指定播放的位置(以毫秒为单位的时间)
  • void setAudioStreamType(int streamtype) :指定流媒体类型
  • void setLooping(boolean looping) :设置是否单曲循环
  • void setNextMediaPlayer(MediaPlayer next) : 当前这个MediaPlayer播放完毕后,MediaPlayer next开始播放
  • void setWakeMode(Context context, int mode):设置CPU唤醒的状态。
  • setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) :网络流媒体的缓冲变化时回调
  • setOnCompletionListener(MediaPlayer.OnCompletionListener listener) :网络流媒体播放结束时回调
  • setOnErrorListener(MediaPlayer.OnErrorListener listener) :发生错误时回调
  • setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当装载流媒体完毕的时候回调。

Android通过MediaPlayer控制播放器的状态的方式来控制媒体文件的播放,其中:

  • prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。
  • start()是真正启动文件播放的方法,
  • pause()和stop()比较简单,起到暂停和停止播放的作用,
  • seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
  • release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。
  • reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。

使用MediaPlayer播放视频的步骤如下:

  1. 创建MediaPlayer对象,并让它加载指定的视频文件;
  2. 在界面布局文件中定义SurfaceView控件,或在程序中创建SurfaceView控件,并为SurfaceView的SurfaceHolder添加Callback监听器;
  3. 调用MediaPlayer对象的setDisney(SurfaceHolder sh)方法将所播放的视频图像输出到指定的SurfaceView控制;
  4. 调用MediaPlayer的start()、stop()、pause()方法来控制视频播放。
下图是一个MediaPlayer对象被支持的播放控制操作驱动的声明周期和状态。其中,椭圆代表MediaPlayer可能驻留的状态,弧线表示驱动MediaPlayer在各个状态之间迁移的播放控制操作。这里有两种类型的弧线。由单箭头开始的弧线代表同步方法调用,而以双箭头开头的弧线代表异步方法调用。

三、使用MediaPlayer实现视频播放

下面我们将展示如何使用MediaPlayer播放香港卫视的视频流:

1. 声明权限

需要在AndroidManifest.xml添加权限。

<uses-permission android:name="android.permission.INTERNET" />

2. 编写SurfaceView布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><SurfaceViewandroid:id="@+id/surface_view"android:layout_width="match_parent"android:layout_height="195dp" /></LinearLayout>
</android.support.constraint.ConstraintLayout>

3. 编写播放视频代码

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {SurfaceView surfaceView;SurfaceHolder surfaceHolder;MediaPlayer mediaPlayer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);surfaceView = findViewById(R.id.surface_view);surfaceHolder = surfaceView.getHolder();surfaceHolder.addCallback(this);mediaPlayer = new MediaPlayer();try {mediaPlayer.setDataSource("http://live.hkstv.hk.lxdns.com/live/hks/playlist.m3u8");} catch (IOException e) {e.printStackTrace();}mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mp.start();}});}@Overridepublic void surfaceCreated(SurfaceHolder holder) {Surface surface = holder.getSurface();mediaPlayer.setSurface(surface);mediaPlayer.prepareAsync();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}
}

四、MediaPlayer使用注意事项

  1. 在使用start()播放流媒体之前,需要装载流媒体资源。这里最好使用prepareAsync()用异步的方式装载流媒体资源。因为流媒体资源的装载是会消耗系统资源的,在一些硬件不理想的设备上,如果使用prepare()同步的方式装载资源,可能会造成UI界面的卡顿,这是非常影响用于体验的。因为推荐使用异步装载的方式,为了避免还没有装载完成就调用start()而报错的问题,需要绑定MediaPlayer.setOnPreparedListener()事件,它将在异步装载完成之后回调。异步装载还有一个好处就是避免装载超时引发ANR((Application Not Responding)错误。

    mediaPlayer = new MediaPlayer();
    mediaPlayer.setDataSource(path);
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    // 通过异步的方式装载媒体资源
    mediaPlayer.prepareAsync();
    mediaPlayer.setOnPreparedListener(new OnPreparedListener() {                    @Overridepublic void onPrepared(MediaPlayer mp) {// 装载完毕回调
              mediaPlayer.start();}
    });

  1. 使用完MediaPlayer需要回收资源。MediaPlayer是很消耗系统资源的,所以在使用完MediaPlayer,不要等待系统自动回收,最好是主动回收资源

    if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;
    }

Android 视频播放器 (二):使用MediaPlayer播放视频相关推荐

  1. Android视频播放器开发—— 探究MediaPlayer

    概述 之前在公司都是做金融和博彩相关的app,很少接触到视频播放类的应用开发,趁最近比较闲,想逐步学习相关的知识,给自己增加点视频类app开发的经验,也希望读者能够从我个人的学习当中得到一些启发. 一 ...

  2. 酷播云html5倍速功能视频播放器,可以倍速播放视频的浏览器插件

    可以倍速播放视频的浏览器插件 Video Speed Controller 是一款倍速播放视频的浏览器插件! 现在网站上播放的视频,基本上都可以实现倍速播放,但偶尔也有些网站上的视频:没有倍速播放功能 ...

  3. Android 视频播放器 (一):使用VideoView播放视频

    一.简介 作为Android开发,我们不可避免的会接触到视频播放,VideoView做为最简单的播放器,我们是不应该不会的. 下面简单介绍一下VideoView: VideoView是使用MediaP ...

  4. Android Video Player. 安卓视频播放器,封装 MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音,悬浮播放,广告播放,列表播放,弹幕

    DKVideoPlayer 项目地址:dueeeke/DKVideoPlayer 简介: Android Video Player. 安卓视频播放器,封装 MediaPlayer.ExoPlayer. ...

  5. android 播放视频链接,如何通过Android视频播放器中的直接链接播放MP4视频?

    我正在制作一个 Android应用程序,我需要通过直接下载链接在Android默认本机视频播放器中播放mp4视频. 要打开Android视频播放器,我使用以下代码 Intent intent = ne ...

  6. MediaPlayer+TextureView,完美切换全屏、小窗口的 Android 视频播放器

    NiceVieoPlayer 项目地址:xiaoyanger0825/NiceVieoPlayer  简介:MediaPlayer+TextureView,完美切换全屏.小窗口的 Android 视频 ...

  7. android视频播放器ui,ArtVideoPlayer 一个灵活的Android视频播放器,支持全屏,小屏播放...

    ArtPlayer 简介 Kotlin实现的视频播放器,将MediaPlayer与VideoView解耦合,支持切换播放器内核(如ExoPlayer和ijkPlayer),支持自定义控制视图,提供Me ...

  8. 基于NDK、C++、FFmpeg的android视频播放器开发实战-夏曹俊-专题视频课程

    基于NDK.C++.FFmpeg的android视频播放器开发实战-1796人已学习 课程介绍         课程包含了对流媒体(拉流)的播放,演示了播放rtmp的香港卫视,支持rtsp摄像头和ht ...

  9. android播放器国内外现状,RockPlayer:全球最好的Android视频播放器?

    RockPlayer是一款Android上的视频播放器,用来播放存储在手机本地的视频,支持几乎所有的视频格式.RockPlayer由中国北京的一家创业团队开发,他们刚刚推出了新版本应用,开始支持And ...

最新文章

  1. III (十七) haproxy(2)
  2. Android app开发捷径,让你少去踩坑
  3. xml tools属性详解
  4. 重载函数的调用匹配规则
  5. 别把机器学习和人工智能搞混了!
  6. P2167 [SDOI2009]Bill的挑战
  7. 系统测试集成测试单元测试_单元和集成测试的代码覆盖率
  8. STM32与多台MS5803压力传感器I2C通讯
  9. Ubuntu抛弃了Untiy转向Gnome,美化之路怎么办?不用怕咱一步一步大变身!
  10. java课程之团队开发冲刺阶段1.7
  11. echart仪表盘旋转_使用echart仪表盘
  12. Bat脚本处理ftp超强案例解说
  13. Java面典_Java集合04——fail-fastfail-safe 详解
  14. Amazon AWS创建Elastic Beanstalk,部署Tomcat,配置MySQL,发布Spring Boot应用
  15. Mysql8.0安装步骤
  16. 未来生活进行时: 畅想未来新兴技术40年——百大趋势性技术汇总(中)
  17. ArcEngine(五)用ICommand接口实现放大缩小
  18. 阿里巴巴的AI价值观,以及“ET大脑”战略
  19. 2019314输入一个日期,输出星期几
  20. 关于学校计算机的情景剧剧本,校园剧本校园情景剧

热门文章

  1. 来来来!统一命名服务、集群管理、分布式应用
  2. 将 Typora 小工具添加到右键菜单中
  3. keepalived原理和安装
  4. php获取ajax data,HTML 获取 PHP 接口数据(ajax)
  5. crc32校验算法_UDP/IP硬件协议栈设计(三):校验
  6. gradle 修改java代码_Gradle 插件
  7. zabbix 2.2 监控mysql_zabbix2.2入门教程之监控mysql(六)
  8. webpack中library和libraryTarget详解
  9. Linux文本加密方法,Linux命令行文本加密的小技巧
  10. java读二进制bin文件内容_利用Java读取二进制文件示例详细解说