十八、Android-手机多媒体之音频、视频

109 阅读2分钟

Android Studio允许我们在项目工程中创建一个assets目录,并在这个目录下存放任意文件和子目录,这些文件和子目录在项目打包时会一并被打包到安装文件中,然后我们在程序中就可以借助AssetManager这个类提供的接口对assets目录下的文件进行读取。

那么首先来创建assets目录吧,它必须创建在app/src/main这个目录下面,也就是和javares这两个目录是平级的。右击app/src/main→New→Directory,在弹出的对话框中选择assets,目录就创建完成了。

18.1 播放音频

MediaPlayer可以用于播放网络、本地以及应用程序安装包中的音频。

播放本地音频,先添加资源文件到assets下。

AssetManager可用于读取assets目录下的任何资源。

最后在onDestroy()方法中,我们还需要分别调用stop()方法和release()方法,将与MediaPlayer相关的资源释放掉。

方法名功能描述
setDataSource()设置要播放的音频文件的位置
prepare()在开始播放之前调用,以完成准备工作
start()开始或继续播放音频
pause()暂停播放音频
reset()将MediaPlayer对象重置到刚刚创建的状态
seekTo()从指定的位置开始播放音频
stop()停止播放音频。调用后的MediaPlayer对象无法再播放音频
release()释放与MediaPlayer对象相关的资源
isPlaying()判断当前MediaPlayer是否正在播放音频
getDuration()获取载入的音频文件的时长
class MainActivity : AppCompatActivity() {
​
    private lateinit var viewBinding: ActivityMainBinding
    private val mediaPlayer = MediaPlayer()
​
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)
​
        initMediaPlayer()
        viewBinding.play.setOnClickListener {
            if (!mediaPlayer.isPlaying) {
                mediaPlayer.start()
            }
        }
        viewBinding.pause.setOnClickListener {
            if (mediaPlayer.isPlaying) {
                mediaPlayer.pause()
            }
        }
        viewBinding.stop.setOnClickListener {
            if (mediaPlayer.isPlaying) {
                mediaPlayer.reset()
                initMediaPlayer()
            }
        }
    }
​
    fun initMediaPlayer() {
        val assetManager = assets
        val fd = assetManager.openFd("actor.mp3")
        mediaPlayer.setDataSource(fd.fileDescriptor, fd.startOffset, fd.length)
        mediaPlayer.prepare()
    }
​
    override fun onDestroy() {
        super.onDestroy()
        mediaPlayer.stop()
        mediaPlayer.release()
    }
}

18.2 播放视频

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

方法名功能描述
setVideoPath()设置要播放的视频文件的位置方法名
start()开始或继续播放视频
pause()暂停播放视频
resume()将视频从头开始播放
seekTo()从指定的位置开始播放视频
isPlaying()判断当前是否正在播放视频
getDuration()获取载入的视频文件的时长
        val uri = Uri.parse("android.resource://$packageName/${R.raw.video}")
        viewBinding.videoView.setVideoURI(uri)
        val videoView = viewBinding.videoView
        viewBinding.playVideo.setOnClickListener {
            if (!videoView.isPlaying) {
                videoView.start()
            }
        }
        viewBinding.pauseVideo.setOnClickListener {
            if (videoView.isPlaying) {
                videoView.pause()
            }
        }
        viewBinding.replayVideo.setOnClickListener {
            if (videoView.isPlaying) {
                videoView.resume()
            }
        }