Media Player 入门

本文档介绍了在使用 Media Player 之前您应该熟悉的基本概念。

声音和视频类

以下类在 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,例如您可能从 Content Resolver 获取的 URI
  • 外部 URL(流式传输)

如需了解 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(例如通过 Content Resolver 获取的 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 流式传输从远程 URL 播放的方法如下所示:

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 是您应用中媒体播放的推荐解决方案。您可以在此处了解更多信息

这些页面涵盖了与音频和视频录制、存储和播放相关的主题: