前言
本文介绍如何通过系统MediaPlayer
,IjkPlayer
,ExoPlayer
分别播放安卓项目下的Raw或Assets文件夹中的音视频文件。
在某些情况下,我们会把一些音视频文件,如Mp3,Mp4等,直接放在安装包中的Raw或者Assets文件夹里,这些音视频文件可能作为特定场景的提示音,或者视频片头等等。关于Raw和Assets资源文件,这里不作过多讨论,总的来讲,他们都是被打包进APK中的文件,不会被编译成二进制,程序可以直接访问,无需额外的权限。
先说明一下本文代码的构建环境和使用的播放内核版本:
- Java 1.7
- Android Studio 3.1.2
- Gradle 4.4
- IjkPlayer 0.8.8
- ExoPlayer 2.8.3
效果演示
Raw/Assets资源文件访问方式
在项目文件夹中的位置:
Raw文件访问方式
Raw
文件位于res/raw目录下,Raw文件会被映射到R.java文件中,所以访问的时候直接使用资源ID即可,如
R.raw.raw_video
或者获得该文件的AssetFileDescriptor:
AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.raw_video);
Assets文件访问方式
Assets
文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
AssetManager am = getAssets();
try {
AssetFileDescriptor afd= am.openFd(fileName);
} catch (IOException e) {
e.printStackTrace();
}
AssetFileDescriptor可以理解成访问Raw/Assets文件的一个入口,或者说是一把钥匙。
Raw/Assets文件还有其他的访问方式,比如通过ContentResolver
,又或者直接开启一个InputStream去读取文件,这应该是播放器内核需要做的事情,我们只需要给播放器提供以上的信息即可。
·········································································································
下面直接上代码
通过系统MediaPlayer播放音视频
- Raw文件
//实例化播放内核
android.media.MediaPlayer mediaPlayer = new android.media.MediaPlayer();
//获得播放源访问入口
AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.raw_video); // 注意这里的区别
//给MediaPlayer设置播放源
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
//设置准备就绪状态监听
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// 开始播放
mediaPlayer.start();
}
});
//准备播放
mediaPlayer.prepareAsync();
- Assets 文件
//实例化播放内核
android.media.MediaPlayer mediaPlayer = new android.media.MediaPlayer();
//获得播放源访问入口
AssetManager am = getAssets();
try {
AssetFileDescriptor afd = am.openFd