播放多媒体文件

我不是罗大锤 2021年11月23日 148次浏览

Android在播放音频和视频方面做了相当不错的支持,它提供了一套较为完整的API。

一、播放音频

Android中播放音频文件一般使用MediaPlayer类来实现,它对多种格式音频文件提供了非常全面的控制方法,下表列出MediaPlayer类一些常用控制方法。
播放多媒体文件_1.png

首先要创建一个MediaPlayer对象,然后调用setDataSource()设置音频文件的路径,再调用prepare()方法使MediaPlayer进入准备状态,接下来调用start()方法就可以开始播放音频,调用pause()方法就会暂停播放,调用reset()方法就会停止播放。

在activity_main.xml新增三个按钮,分别对应播放、暂停、停止:

<LinearLayout ...>
    <Button
        android:id="@+id/play"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Play" />
    <Button
        android:id="@+id/pause"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Pause" />
    <Button
        android:id="@+id/stop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Stop" />
</LinearLayout>

提前准备好一个MP3音频放入main/assets目录。

class MainActivity : AppCompatActivity() {
    private val mediaPlayer = MediaPlayer()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 初始化MediaPlayer对象
        initMediaPlayer()
        play.setOnClickListener {
            if(!mediaPlayer.isPlaying) {
                // 开始播放
                mediaPlayer.start()
            }
        }
        pause.setOnClickListener {
            if(mediaPlayer.isPlaying) {
                // 暂停播放
                mediaPlayer.pause()
            }
        }
        stop.setOnClickListener {
            if(mediaPlayer.isPlaying) {
                // 停止播放
                mediaPlayer.reset()
                initMediaPlayer()
            }
        }
    }
    
    private fun initMediaPlayer() {
        // 获取AssetManager实例,用于读取assets目录下任何资源
        val assetManager = assets
        // 将音频文件句柄打开
        val fd = assetManager.openFd("music.mp3")
        // 给MediaPlayer设置要播放的文件
        mediaPlayer.setDataSource(fd.fileDescriptor, 
            fd.startOffset, fd.length)
        // 播放前准备工作
        mediaPlayer.prepare()
    }
    
    override fun onDestroy() {
        super.onDestroy()
        // onDestroy中释放MediaPlayer资源
        mediaPlayer.stop()
        mediaPlayer.release()
    }
}

二、播放视频

播放视频主要使用VideoView类来实现,这个类将视频显示和控制集于一身,仅仅借助它 就可以完成一个简易视频播放器,VideoView和MediaPlayer用法也比较类似,常用方法如下表所示。

VideoView并不是一个万能的视频播放工具类,它在视频格式的支持以及播放效率方面都存在着较大的不足,所以如果仅仅使用VideoView就写出一个强大的视频播放器是不太现实的,但如果只是用于播放一些游戏的片头动画,或者某个应用的视频宣传,使用VideoView还是绰绰有余的。
播放多媒体文件_2.png

给activity_main.xml也设置三个按钮,分别对应播放、暂停、重新播放。另外在按钮下面又放置一个VideoView,稍后的视频就显示在这里。这里就不展示layout代码。

VideoView不支持直接播放assets目录下的视频资源,所以我们只能寻找其他的解决方案,res目录下允许我们再创建一个raw目录,诸如音频、视频之类的资源文件也可以放在这里,并且VideoView是可以直接播放这个目录下的视频资源。

class MainAcivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 将video文件解析成Uri对象,Android固定写法
        val uri = Uri.parse("android.resource://$packageName/${R.raw.vide}")
        // 给VideoView指定视频Uri
        videoView.setVideoURI(uri)
        play.setOnClickListener {
            if(!videoView.isPlaying) {
                // 开始播放
                videoView.start()
            }
        }
        pause.setOnClickListener {
            if(videoView.isPlaying) {
                // 暂停播放
                videoView.pause()
            }
        }
        replay.setOnClickListener {
            if(!videoView.isPlaying) {
                // 重新播放
                videoView.resume()
            }
        }
    }
    
    override fun onDestroy() {
        super.onDestroy()
        // 释放VideoView资源
        videoView.suspend()
    }
}