媒体播放器使用入门

本文档介绍了您在使用媒体播放器之前应熟悉的基本概念。

声音和视频类

以下类在 Android 框架中播放声音和视频:

  • MediaPlayer:此类是用于播放声音和视频的主要 API。
  • AudioManager:此类用于管理设备上的音频源和音频输出。

清单声明

在开始使用 MediaPlayer 开发应用之前,请确保您的清单具有适当的声明,这样才能使用相关功能。

  • 互联网权限:如果您使用 MediaPlayer 流式播放基于网络的内容,则您的应用必须申请网络访问权限。

    <uses-permission android:name="android.permission.INTERNET" />
    
  • 唤醒锁定权限:如果您的播放器应用需要防止屏幕变暗或处理器进入休眠状态,或者要使用 MediaPlayer.setScreenOnWhilePlaying(boolean)MediaPlayer.setWakeMode(android.content.Context, int) 方法,则您必须申请此权限。

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

使用 MediaPlayer 类

MediaPlayer 类是媒体框架的重要组成部分。此类的对象能够获取、解码以及播放音频和视频,而且只需极少量设置。MediaPlayer 支持多种媒体源,包括:

  • 本地资源
  • 内部 URI,例如您可能从内容解析器那获取的 URI
  • 外部网址(流式传输)

如需了解 Android 支持的媒体格式列表,请参阅支持的媒体格式页面。

使用音频源的示例

以下示例展示了如何播放作为本地原始资源(保存在应用的 res/raw/ 目录中)提供的音频:

Kotlin

var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you

Java

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you

在本例中,“原始”资源是指系统不会尝试以任何特定方式解析的文件。不过,该资源的内容不应为原始音频。它应该是采用某种支持的格式且经过适当编码和格式化的媒体文件。

播放系统中本地可用的 URI(例如,您可以通过内容解析器获取)中的内容方法如下:

Kotlin

val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(applicationContext, myUri)
    prepare()
    start()
}

Java

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

使用 HTTP 流式传输并播放远程网址上的内容如下所示:

Kotlin

val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(url)
    prepare() // might take long! (for buffering, etc)
    start()
}

Java

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();

使用异步准备提高性能

使用 MediaPlayer 时,请注意性能。例如,对 prepare() 的调用可能需要很长时间来执行,因为它可能涉及获取和解码媒体数据。因此,与任何可能需要很长时间来执行的方法一样,切勿从应用的界面线程中调用它。这样做会导致界面停止响应,直到该方法返回,这是一种糟糕的用户体验,并且可能会导致 ANR(应用无响应)错误。

为避免界面线程挂起,请生成其他线程来准备 MediaPlayer,并在准备工作完成后通知主线程。该框架提供了一种便捷的方法来实现 prepareAsync() 方法来执行此任务。此方法会在后台开始准备媒体,并立即返回。当媒体准备就绪后,系统会调用通过 setOnPreparedListener() 配置的 MediaPlayer.OnPreparedListeneronPrepared() 方法。

了解详情

Jetpack Media3 是应用中播放媒体的推荐解决方案。详细了解

以下页面介绍了有关录制、存储以及播放音频和视频的主题: