Android中的MediaPlayer的使用详解

article/2025/10/2 1:27:53

今天本文介绍的是Andriod系统自带的Mediaplayer,和VideoView实现简单的音乐和视频的播放,至于想做出如酷狗音乐这样的APP的话,只要想做,应该也不难,都是基于此实现了功能的扩展。

Android的MediaPlayer包含了Audio和Video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer来实现的。

一、播放音频文件

     首先看看MediaPlaer的生命周期

在这里插入图片描述

下面是MediaPlayer提供的常用方法

方法说明
MediaPlayer构造方法
create创建一个要播放的多媒体
getCurrentPosition得到当前播放位置
getDuration得到文件的时间
getVideoHeight得到视频的高度
getVideoWidth得到视频的宽度
isLooping是否循环播放
isPlaying是否正在播放
pause暂停
prepare准备(同步)
prepareAsync准备(异步)
release释放MediaPlayer对象相关的资源
reset重置MediaPlayer对象为刚刚创建的状态
seekTo指定播放的位置(以毫秒为单位的时间)
setAudioStreamType设置流媒体的类型
setDataSource设置多媒体数据来源(位置)
setDisplay设置用SurfaceHolder来显示多媒体
setLooping设置是否循环播放
setOnButteringUpdateListener网络流媒体的缓冲监听
setOnErrorListener设置错误信息监听
setOnVideoSizeChangedListener视频尺寸监听
setScreenOnWhilePlaying设置是否使用SurfaceHolder来保持屏幕显示
setVolume设置音量
start开始播放
stop停止播放

MediaPlayer的工作流程是这样的:

1、首先创建MediaPlaer对象;

2、然后调用setDataSource()方法来设置音频文件的路径;

3 、再调用prepare()方法使MediaPlayer进入到准备状态;

4 、调用start方法就可以播放音频。

创建MediaPlaer对象有两种方式

1、直接new出来

MediaPlayer mp = new MediaPlayer();  

2、使用create方式

MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了  

当然上面首先得在res文件夹下新建raw文件夹,并放置一个test文件

设置播放的文件

MediaPlayer要播放的文件主要包括3个来源:

a. 用户在应用中事先自带的resource资源

例如:

MediaPlayer.create(this, R.raw.test);

b. 存储在SD卡或其他文件路径下的媒体文件

例如:

mp.setDataSource("/sdcard/test.mp3");

c. 网络上的媒体文件

例如:

mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");

MediaPlayer的setDataSource一共四个方法:

setDataSource (String path) 
setDataSource (FileDescriptor fd) 
setDataSource (Context context, Uri uri) 
setDataSource (FileDescriptor fd, long offset, long length)

其中使用FileDescriptor时,需要将文件放到与res文件夹平级的assets文件夹里,然后使用:

AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());

下面是实现代码

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:layout_margin="3dp"  android:orientation="vertical" >  <LinearLayout  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:orientation="horizontal" >  <Button  android:id="@+id/play"  android:layout_width="0dp"  android:layout_height="wrap_content"  android:layout_weight="1"  android:text="播放" />  <Button  android:id="@+id/pause"  android:layout_width="0dp"  android:layout_height="wrap_content"  android:layout_weight="1"  android:text="暂停" />  <Button  android:id="@+id/stop"  android:layout_width="0dp"  android:layout_height="wrap_content"  android:layout_weight="1"  android:text="停止" />  </LinearLayout>  <SeekBar  android:id="@+id/seekbar"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:max="0"  android:progress="0"  android:secondaryProgress="0" />  <RelativeLayout  android:layout_width="match_parent"  android:layout_height="wrap_content" >  <TextView  android:id="@+id/tv"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_alignParentLeft="true"  android:text="当前时间" />  <TextView  android:id="@+id/tv2"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_alignParentRight="true"  android:text="总时间" />  </RelativeLayout>  </LinearLayout>  

MainActivity.java

package com.example.musicplayer;  import java.io.File;  
import java.io.IOException;  import android.R.integer;  
import android.app.Activity;  
import android.media.MediaPlayer;  
import android.os.Bundle;  
import android.os.Environment;  
import android.os.Handler;  
import android.os.Message;  
import android.util.Log;  
import android.view.Menu;  
import android.view.MenuItem;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.SeekBar;  
import android.widget.SeekBar.OnSeekBarChangeListener;  
import android.widget.TextView;  public class MainActivity extends Activity implements OnClickListener,  OnSeekBarChangeListener {  private Button play, pause, stop;  private MediaPlayer player;  private SeekBar mSeekBar;  private TextView tv, tv2;  private boolean hadDestroy = false;  private Handler mHandler = new Handler() {  public void handleMessage(android.os.Message msg) {  switch (msg.what) {  case 0x01:  break;  default:  break;  }  };  };  Runnable runnable = new Runnable() {  @Override  public void run() {  if (!hadDestroy) {  mHandler.postDelayed(this, 1000);  int currentTime = Math  .round(player.getCurrentPosition() / 1000);  String currentStr = String.format("%s%02d:%02d", "当前时间 ",  currentTime / 60, currentTime % 60);  tv.setText(currentStr);  mSeekBar.setProgress(player.getCurrentPosition());  }  }  };  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  play = (Button) findViewById(R.id.play);  pause = (Button) findViewById(R.id.pause);  stop = (Button) findViewById(R.id.stop);  mSeekBar = (SeekBar) findViewById(R.id.seekbar);  tv = (TextView) findViewById(R.id.tv);  tv2 = (TextView) findViewById(R.id.tv2);  mSeekBar.setOnSeekBarChangeListener(this);  play.setOnClickListener(this);  pause.setOnClickListener(this);  stop.setOnClickListener(this);  player = new MediaPlayer();  initMediaplayer();  }  /** * 初始化播放器 */  private void initMediaplayer() {  try {  File file = new File(Environment.getExternalStorageDirectory()  + "/Download/", "aiqiu.mp3");  player.setDataSource(file.getPath());  Log.e("播放器", file.toString());  player.prepare();  } catch (Exception e) {  e.printStackTrace();  }  }  @Override  public void onClick(View v) {  switch (v.getId()) {  case R.id.play:  if (!player.isPlaying()) {  player.start();  int totalTime = Math.round(player.getDuration() / 1000);  String str = String.format("%02d:%02d", totalTime / 60,  totalTime % 60);  tv2.setText(str);  mSeekBar.setMax(player.getDuration());  mHandler.postDelayed(runnable, 1000);  }  break;  case R.id.pause:  if (player.isPlaying()) {  player.pause();  }  break;  case R.id.stop:  if (player.isPlaying()) {  player.reset();  initMediaplayer();  }  break;  default:  break;  }  }  @Override  public void onProgressChanged(SeekBar seekBar, int progress,  boolean fromUser) {  if (player != null) {  player.seekTo(seekBar.getProgress());  }  }  @Override  public void onStartTrackingTouch(SeekBar seekBar) {  // TODO 自动生成的方法存根  }  @Override  public void onStopTrackingTouch(SeekBar seekBar) {  // TODO 自动生成的方法存根  }  @Override  protected void onDestroy() {  // TODO 自动生成的方法存根  super.onDestroy();  if (player != null) {  player.stop();  hadDestroy = true;  player.release();  }  }  
}  

二、播放视频文件

 播放视频文件相比播放音频文件并不比它复杂,这里使用VideoView类来实现。这个类将视频的显示和控制集于一身。VideoView和MediaPlaer也比较类似,主要有以下常用方法
方法名功能描述
setVideoPath()设置要播放的视频文件的位置。
start()开始或继续播放视频。
pause()暂停播放视频。
resume()将视频重头开始播放。
seekTo()从指定的位置开始播放视频。
isPlaying()判断当前是否正在播放视频。
getDuration()获取载入的视频文件的时长。

因为VideoView是包装过的MediaPlayer,所以使用起来很相似。
比如:

private void initVideoPlayer() {  File file = new File(Environment.getExternalStorageDirectory()  + "/Download/", "Sample.3gp");  videoPlayer.setVideoPath(file.getPath());// 指定视频文件的路径  }  

事件处理

@Override  public void onClick(View v) {  switch (v.getId()) {  case R.id.play:  if (!videoPlayer.isPlaying()) {  videoPlayer.start();  }  break;  case R.id.pause:  if (videoPlayer.isPlaying()) {  videoPlayer.pause();  }  break;  case R.id.stop:  if (videoPlayer.isPlaying()) {  videoPlayer.resume();  }  break;  default:  break;  }  }  

三、常见的MediaPlayer错误

    也就是它的错误状态。比如这样的错误 start called in state 0,0表示他的错误状态,下面是MediaPlayer的状态,源码中找到的:
enum media_player_states {  MEDIA_PLAYER_STATE_ERROR        = 0,           // 0状态  MEDIA_PLAYER_IDLE               = 1 << 0,     // 1状态  MEDIA_PLAYER_INITIALIZED        = 1 << 1,    // 2 状态  MEDIA_PLAYER_PREPARING          = 1 << 2,    // 4 状态  MEDIA_PLAYER_PREPARED           = 1 << 3,   // 8状态  MEDIA_PLAYER_STARTED            = 1 << 4,   // 16状态  MEDIA_PLAYER_PAUSED             = 1 << 5,  // 32状态  MEDIA_PLAYER_STOPPED            = 1 << 6,  // 64 状态  MEDIA_PLAYER_PLAYBACK_COMPLETE  = 1 << 7,  // 128 状态  }  
可以参照报错的状态和MediaPlayer的生命周期(上图)进行错误分析。

http://chatgpt.dhexx.cn/article/q784aKhE.shtml

相关文章

MediaPlayer详解和使用

Android多媒体相关的API&#xff0c;网上基本都能找到很多相关的文章&#xff0c;使用起来也很简单&#xff0c;一直在犹豫要不要写这方面的内容&#xff0c;后来决定还是写一写&#xff0c;一方面算是一个归纳总结&#xff0c;另一方面&#xff0c;也方便以后查阅。这一篇就写…

MediaPlayer的使用

MediaPlayer的使用 MediaPlayer的使用&#xff08;2019.07.16&#xff09;1.视频播放器的原理2.Android系统自带的MediaPlay状态机详解&#xff08;MediaPlay的生命周期&#xff09;3.如何使用MediaPlayer播放音频与视频&#xff08;一 &#xff09;播放音频&#xff08;二&…

MediaPlayer使用以及常见问题

前面已经写过一篇类似的文章&#xff0c;但是还不够细致&#xff1a; 采用Android的MediaPlayerSurfaceView设计视频播放器 这里我们重新理一下&#xff0c;并记录一点实际运用时遇到的问题。 MediaPlayer特性 MediaPlayer类用于控制音频文件、视频文件和流的播放。 Media…

Android MediaPlayer类

1. MediaPlayer方法 MediaPlayer创建 可以直接调用构造函数&#xff0c;利用setDataSource()方法设置资源。MediaPlayer mp new MediaPlayer(); // path可以是本地路径&#xff0c;也可以是网络地址 mp.setDataSource(String path);也可以调用create()方法&#xff0c;create…

MediaPlayer状态图及生命周期

MediaPlayer状态图及生命周期 MediaPlayer是Android中的uoge多媒体播放类&#xff0c;我们能通过它控制音视频流或本地音视频资源的播放过程。 这一片博客主要介绍MediaPlayer状态图及生命周期。先看一张官网很经典的MediaPlayer状态机的图片。 其中椭圆代表MediaPlayer驻留…

Android 使用MediaPlayer播放音频详解

目录 一、官方资料 二、简单介绍 三、MediaPlayer使用 1.创建MediaPlayer实例 2.重要API 3.状态图 4.代码 5.常用API 6.辅助效果 总结 一、官方资料 MediaPlayer 概览https://developer.android.google.cn/guide/topics/media/mediaplayer?hlzh_cn MediaPlayer 文…

Android -- 多媒体播放之MediaPlayer基础简介

Android -- MediaPlayer基础简介 MediaPlayer是Android中的一个多媒体播放类&#xff0c;我们能通过它控制音视频流或本地音视频资源的播放过程。 这段时间查阅了Android官方文档对MediaPlayer的介绍&#xff0c;同时也看了一些书籍介绍。现在把MediaPlayer的基础内容在此做一…

网易雷火9.18笔试题

3小时的题 我迟到了1个小时&#xff0c;提前了40分钟润&#xff0c;花了1个小时20分钟&#xff08;中途有点其他事&#xff09;&#xff0c;a了2道&#xff0c;第三题没思路&#xff0c;第4题不想看&#xff0c;就这样吧 #include <iostream> using namespace std; int…

网易笔试题总结

var string string; var number 0; var bool true; console.log(number || string); console.log(number && string); console.log(bool || number); console.log(bool && number); 输出结果 如果换下string和num的位置呢 var string string1; var numbe…

网易2019笔试题

1.苹果分堆 计算累加小组成员数&#xff0c;结合二分查找&#xff0c;复杂度O( min(n, mlogn) ) package wangyi123;import java.util.Scanner;public class groupNum {public static void main(String[] args) {Scanner sc new Scanner(System.in);while (sc.hasNext()) {i…

2022-08-20-网易笔试题

写在前面 题目收集来源自网络&#xff0c;前四题是开发岗的&#xff0c;后四题是算法岗的&#xff0c;因为代码无处提交&#xff0c;不一定正确&#xff0c;就不贴出来了&#xff0c;这里只写一下我的思路吧~欢迎大家一起讨论~~ 1、 思路&#xff1a;因为最大1e9&#xff0c…

网易游戏策划笔试-20190404

1-7题为文案题&#xff08;答题时请勿参考其他作品&#xff09;&#xff0c;8-23题为数值系统题&#xff0c; 两个方向分别计算分数&#xff0c;最终选择分数更高的方向作为最终成绩&#xff0c;建议优先选择自己擅长或感兴趣的方向进行答题。 8、&#xff08;无需过程&#xf…

JESD204接口调试总结——JESD204+In-system-ibert

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 JESD204接口调试总结——JESD204In-system-ibert 前言IP核的设置IP核连线调试jtag界面总结 前言 之前我们在讲serdes的时候讲到了使用in-system-ibert来进行眼图的扫描&…

JESD204B IP核的配置与使用

一、JESD204 配置方式&#xff1a; Configuration 1、Transmit or Receive: 选择是作为接收机还是发射机 2、LFMC : 默认值 3、Number of lanes : 传输的通道数&#xff0c;根据实际需求选择 4、pattern&#xff1a;模式的选择&#xff0c;正常情况下两个都不选 5、clocki…

JESD204接口调试总结——Xilinx JESD204B IP testbench解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 JESD204接口调试总结——Xilinx JESD204B IP testbench解析 IP核配置testbench工程部分代码解读 IP核配置 1、IP核为接收功能 2、LMFC buffer设定为最大 3、4条lane 4、sysre…

STC15W204S下载

一&#xff1a;所使用测试板。 为8管脚最小板&#xff0c; 二&#xff1a;工程新建。 一&#xff1a;keil c51。 2&#xff1a;新建main,加入工程。 测试程序&#xff1a; #include <reg52.h>//stc15w20s为51内核#define MAIN_Fosc 35000000UL //定义主时钟sbit PIN_LE…

JESD204B 系统复位与同步选项

CGS&#xff0c;代码组同步&#xff0c;ILA&#xff0c;初始化多帧序列帧同步&#xff0c;然后进行数据传输 。 系统复位 在系统复位上&#xff1a;JESD204中提供了一个全局的异步时钟复位&#xff0c;rx_reset用来复位整个系统&#xff0c;AXI4-Lite系统总线复位不受此影响&am…

Atsha204a使用心得

最近公司要用到Atsha204a做软件和硬件的绑定加密&#xff0c;于是就调了它的驱动&#xff0c;将使用过程中遇到的坑整理下&#xff0c;也好让各位同仁少加点班&#xff1b;废话少说&#xff0c;直接入正题。 0.加密原理&#xff1a; 主控端和Atsha204a端有相同的16 组密码&am…

JESD204B接口调试记录3 - 总结

目录 一、介绍下项目历史情况 二、为什么要用fs4模式&#xff1f; 三、为什么要将采样率改成2.5Gsps&#xff1f; 四、时钟芯片参数如何设置&#xff1f; 五、AD芯片参数如何设置&#xff1f; 六、FPGA工程里JESD204 IP如何设置&#xff1f; 七、传输层如何解包&#xff…

【JESD204B】基于JESD204B协议的ADC、DAC数据传输

1、JESD204协议概述 ADC、DAC技术即模数、数模转换技术&#xff0c;在军用和民用领域广泛应用&#xff0c;如现在常用的有微信语音、网络电话、其典型数据处理流程&#xff1a; 语音输入->ADC采样->调制->基站->无线传输->基站->解调->DAC->语音输出…