专栏首页AnRFDevAndroid MediaPlayer 播放音频

Android MediaPlayer 播放音频

本文链接: Android MediaPlayer 播放音频

主要介绍使用MediaPlayer播放音频的方式。关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPlayer 基础简介

为了方便表达,定义变量名为mediaPlayer。

MediaPlayer的使用方式

创建MediaPlayer

可以直接 new MediaPlayer,也可以用MediaPlayer提供的create方法创建。

mediaPlayer = new MediaPlayer();

使用create方法创建成功后,mediaPlayer处于Prepared状态。可以直接start播放。

mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));
mediaPlayer.start();

设置音源 - setDataSource

通过调用setDataSource来设置音源。setDataSource有多个重载方法,我们来看常用的几种。

例如设置使用assets里的资源。实际情况可能需要try catch。

AssetFileDescriptor fd = null;
MediaPlayer mediaPlayer = new MediaPlayer();
fd = context.getApplicationContext().getAssets().openFd(name);
mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());

本地文件,需要文件的绝对路径。

mediaPlayer.setDataSource(file.getAbsolutePath());

或者获取文件的Uri来创建mediaPlayer。

mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.fromFile(file));

设置网络音频,也是用setDataSource方法,设置url。

mediaPlayer.setDataSource("https://demo.com/sample.mp3"));

播放网络音频时,如果使用的是http,有可能会报错

java.io.IOException: Cleartext HTTP traffic to demo.com not permitted

可以简单地设置一下manifest,设置usesCleartextTraffic=”true”

<application
        android:usesCleartextTraffic="true">

准备 - prepare

同步和异步准备音频资源。prepareAsync()是异步的方式,prepare是同步的。注意线程调度问题,同时不要阻塞UI线程。

使用异步方式准备音频,经常与MediaPlayer.OnPreparedListener监听器配合使用。异步准备时,也可以进行其他的设置。

mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        mediaPlayer.start(); // 准备好了就播放
    }
});

循环播放 - Looping

设置循环播放setLooping。

mediaPlayer.setLooping(true);

播放完毕后,不会回调OnCompletionListener,而是从头播放当前音频。

播放 - start

播放音频,调用start方法。

mediaPlayer.start();

处于Prepared,Pause和PlaybackComplete状态时,可以调用start方法,进入Started状态。

暂停 - pause

暂停播放,使用pause方法。在暂停前先判断一下mediaPlayer的是否在播放。

if (mediaPlayer.isPlaying()) {
    mediaPlayer.pause();
}

暂停成功则处于Paused状态。

停止 - stop

回顾一下MediaPlayer状态切换的图示,我们可以得知在播放中,暂停,播放完成这3个状态下,可以调用stop方法,进入Stopped状态。

mediaPlayer.stop();

调进度 - seekTo

调整播放进度。我们平时使用音乐播放软件一般都会有这个功能。 seekTo方法接受一个毫秒参数。

int targetMS = (int) (percent * mediaPlayer.getDuration());
mediaPlayer.seekTo(targetMS);

seekTo并不会改变MediaPlayer的状态。

重置 - reset

reset后的mediaPlayer进入Idle状态。需要重新设置音源与准备。

释放 - release

不再使用这个mediaPlayer时,应当尽快释放掉,以释放相关的资源。 调用release后,mediaPlayer进入End状态。此时这个mediaPlayer就不能再使用了。

常用监听器

缓冲监听器 OnBufferingUpdateListener

比如我们加载网络音频的时候,常用这个监听器来监听缓冲进度。显示缓冲进度,也可以提高用户体验。

mMediaPlayer.prepareAsync();
mMediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        // percent代表缓冲百分比
    }
});

错误监听器 OnErrorListener

mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
    @Override
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
        return true; // 返回true表示在此处理错误,不会回调onCompletion
    }
});

注意onError的返回值。可以选择自己处理error。

 * @return True if the method handled the error, false if it didn't.
 * Returning false, or not having an OnErrorListener at all, will
 * cause the OnCompletionListener to be called.
 */
boolean onError(MediaPlayer mp, int what, int extra);

播放完毕监听器 OnCompletionListener

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        // 播放完毕
    }
});

使用示例

播放assets里的音频

播放assets里的音频文件,使用到AssetFileDescriptor类。使用后记得关闭AssetFileDescriptor。

private void playAssetsAudio(final String name, Context context) {
    Log.d(TAG, "playAssetWordSound: try to play assets sound file. -> " + name);
    AssetFileDescriptor fd = null;
    try {
        MediaPlayer mediaPlayer;
        Log.v(TAG, "Looking in assets.");
        fd = context.getApplicationContext().getAssets().openFd(name);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.reset();
        mediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
        mediaPlayer.prepareAsync();
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                Log.d(TAG, "onPrepared: " + name);
                mediaPlayer.start();
            }
        });
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
                Log.d(TAG, "onCompletion: " + name);
            }
        });
        mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int i, int i1) {
                mp.release();
                return true;
            }
        });
    } catch (Exception e) {
        try {
            if (fd != null) {
                fd.close();
            }
        } catch (Exception e1) {
            Log.e(TAG, "Exception close fd: ", e1);
        }
    } finally {
        if (fd != null) {
            try {
                fd.close();
            } catch (IOException e) {
                Log.e(TAG, "Finally, close fd ", e);
            }
        }
    }
}

播放本地音频文件

尝试播放音频文件。仅播放一次。

private void playAudioFile(final File file) {
    Log.d(TAG, "playAudioFile: " + file.getAbsolutePath());
    MediaPlayer mediaPlayer;
    try {
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setLooping(false);
        mediaPlayer.setDataSource(file.getAbsolutePath());
        mediaPlayer.prepare();
        mediaPlayer.start();
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
            }
        });
        mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
                Log.d(TAG, "Play local sound onError: " + i + ", " + i1);
                return true;
            }
        });
    } catch (Exception e) {
        Log.e(TAG, "playAudioFile: ", e);
    }
}

播放在线音频

设置url,播放在线音频

private void playOnlineSound(String soundUrlDict) {
    try {
        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setDataSource(soundUrlDict);
        mediaPlayer.prepareAsync();
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                mediaPlayer.start();
            }
        });
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                if (mp != null) {
                    mp.release();
                }
                Log.d(TAG, "onCompletion: play sound.");
            }
        });
        mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
                Log.d(TAG, "Play online sound onError: " + i + ", " + i1);
                return false;
            }
        });
    } catch (IOException e1) {
        Log.e(TAG, "url: ", e1);
    }
}

代码可以参考示例工程: https://github.com/RustFisher/android-MediaPlayer

更多参考:

Android MediaPlayer 基础简介

Android MediaPlayer 播放音频

Android 使用URLConnection下载音频文件

Android MediaPlayer 音频倍速播放,调整播放速度

Android音视频相关文章请参考 https://rustfisher.com/tags/Android-Media/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android MediaPlayer 播放音频的方式

    主要介绍使用MediaPlayer播放音频的方式。关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPlayer 基础简介。

    砸漏
  • Android应用的必要功能——音频的播放

    Android应用面向的是普通个人用户,这些用户往往会更加关注用户体验,因此为Android应用增加动画、视频、音乐等多媒体功能十分必要。就目前的手机发展趋势来...

    博文视点Broadview
  • Android多媒体应用使用MediaPlayer播放音频

    Android提供了对常用音频和视频格式的支持,它所支持的音频格式有MP3(.mp3)、3GPP(.3gp)、Ogg(.ogg)和WAVE(.ave)等,支持的...

    砸漏
  • Android MediaPlayer 音频倍速播放,调整播放速度

    现在市面上的很多音视频App都有倍速播放的功能,例如把播放速度调整为0.5、1.5、2倍等等。

    AnRFDev
  • Android 使用URLConnection下载音频文件

    使用MediaPlayer播放在线音频,请参考Android MediaPlayer 播放音频

    AnRFDev
  • Android编程实现播放音频的方法示例

    本文实例讲述了Android编程实现播放音频的方法。分享给大家供大家参考,具体如下:

    砸漏
  • Android开发中播放声音的两种方法分析

    本文实例讲述了Android开发中播放声音的两种方法。分享给大家供大家参考,具体如下:

    砸漏
  • Android音频系统AudioTrack使用方法详解

    在android中播放声音可以用MediaPlayer和AudioTrack两种方案的,但是两种方案是有很大区别的,MediaPlayer可以播放多种格式的声音...

    砸漏
  • android实现小音频频繁播放

    android中多媒体文件(音乐和视频)的播放是用MediaPlayer方式是大家比较熟悉的,但是现在要来说一下另外一种音乐文件播放的方式SoundPool,相...

    砸漏
  • Android编程视频播放API之MediaPlayer用法示例

    本文实例讲述了Android编程视频播放API之MediaPlayer用法。分享给大家供大家参考,具体如下:

    砸漏
  • Android开发笔记(一百二十六)自定义音乐播放器

    在Android手机上面,音频的处理比视频还要复杂,这真是出人意料。在前面的博文《Android开发笔记(五十七)录像录音与播放》中,介绍了视频/音频的录制...

    用户4464237
  • 使用Android MediaPlayer播放媒体文件

    我们平时利用Android手机娱乐最常见的方式莫过于听歌和看电影了,当然还有玩游戏,当然,这里我要说的是针对Android对于媒体文件播放的支持。Android...

    指点
  • Android开发之媒体播放工具类完整示例

    本文实例讲述了Android开发之媒体播放工具类。分享给大家供大家参考,具体如下:

    砸漏
  • android实现简单音乐播放器

    写这个音乐播放器实在是迫不得已。因为我们Andoird课程要求写一个音乐播放器。所以就有了此项目。这个项目比较简单,实现了最基本的音乐播放功能,然后界面是仿照着...

    砸漏
  • Android实现语音播放与录音功能

    本文实例为大家分享了Android实现语音播放与录音的具体代码,供大家参考,具体内容如下

    砸漏
  • Android MediaPlayer 音频倍速播放 调整播放速度问题

    现在市面上的很多音视频App都有倍速播放的功能,例如把播放速度调整为0.5、1.5、2倍等等。

    砸漏
  • 4款知名播放器比较:ijkPlayer、VLC、SmartPlayer、ExoPlayer

    ijkPlayer是BiliBili公司维护的一个开源工程,基于ffmpeg开发的一个播放器软件,支持Android和iOS平台,整个ijkplayer就是以f...

    daniulive
  • Android中如何使用OpenGL播放视频

    视频播放主要经历这么几个步骤:解协议 -> 解封装 -> 解码音视频 -> 音视频同步,流程如下图:

    雪月清
  • Android开发实现的简单媒体播放器功能示例

    本文实例讲述了Android开发实现的简单媒体播放器功能。分享给大家供大家参考,具体如下:

    砸漏

扫码关注云+社区

领取腾讯云代金券