本節(jié)帶來的是Android多媒體中的——MediaPlayer媒佣,我們可以通過這個API來播放音頻和視頻 該類是Androd多媒體框架中的一個重要組件昼捍,通過該類宁炫,我們可以以最小的步驟來獲取烁登,解碼 和播放音視頻窟感。它支持三種不同的媒體來源:
- 本地資源
- 內(nèi)部的URI伺糠,比如你可以通過ContentResolver來獲取
- 外部URL(流) 對于Android所支持的的媒體格式列表
使用MediaPlayer播放音頻:
1)獲得MediaPlayer實例:
MediaPlayer mp = new MediaPlayer();
MediaPlayer mp = MediaPlayer.create(this, R.raw.test); //無需再調(diào)用setDataSource
另外create還有這樣的形式: create(Context context, Uri uri, SurfaceHolder holder) 通過Uri和指定 SurfaceHolder 【抽象類】 創(chuàng)建一個多媒體播放器
2)設(shè)置播放文件:
//①raw下的資源:
MediaPlayer.create(this, R.raw.test);
//②本地文件路徑:
mp.setDataSource("/sdcard/test.mp3");
//③網(wǎng)絡(luò)URL文件:
mp.setDataSource("http://www.xxx.com/music/test.mp3");
另外setDataSource()方法有多個伯病,里面有這樣一個類型的參數(shù):FileDescriptor柜候,在使用這個 API的時候碎连,需要把文件放到res文件夾平級的assets文件夾里灰羽,然后使用下述代碼設(shè)置DataSource:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
3)其他方法
實例
//[1]初始化mediaplayer
MediaPlayer mediaPlayer = new MediaPlayer();
//[2]設(shè)置要播放的資源位置 path 可以是網(wǎng)絡(luò) 路徑 也可是本地路徑
try {
mediaPlayer.setDataSource("/mnt/sdcard/xpg.mp3");
//[3]準備播放
mediaPlayer.prepare();
//[4]開始播放
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
本地Uri:
Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
網(wǎng)絡(luò)音頻
String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
使用MediaPlayer播放視頻:
MediaPlayer主要用于播放音頻,沒有提供圖像輸出界面鱼辙,所以我們需要借助其他的 組件來顯示MediaPlayer播放的圖像輸出廉嚼,我們可以使用用SurfaceView 來顯示,下面我們使用SurfaceView來寫個視頻播放的例子:
//[0]找到控件用來顯示播放視頻的內(nèi)容
final SurfaceView sfv = (SurfaceView) findViewById(R.id.sfv);
//獲取holder 對象 用來維護視頻播放的內(nèi)容
SurfaceHolder holder = sfv.getHolder();
//[0.1]添加holder 生命周期 方法
holder.addCallback(new Callback() {
//當surface view 銷毀
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("surfaceDestroyed");
//停止播放視頻
if (mediaPlayer!=null && mediaPlayer.isPlaying()) {
//獲取到當前播放視頻的位置
currentPosition = mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}
}
//這個方法執(zhí)行了 說明sufaceView準備好了
@Override
public void surfaceCreated(SurfaceHolder holder) {
//[1]初始化mediaplayer
System.out.println("surfaceCreated");
mediaPlayer = new MediaPlayer();
//[2]設(shè)置要播放的資源位置 path 可以是網(wǎng)絡(luò) 路徑 也可是本地路徑
try {
mediaPlayer.setDataSource("http://192.168.11.86:8080/cc.MP4");
//[3]準備播放
mediaPlayer.prepareAsync();
//[3.0]設(shè)置顯示給sfv sufraceholder 是用來維護視頻播放的內(nèi)容
mediaPlayer.setDisplay(holder);
//[3.1]設(shè)置一個準備完成的監(jiān)聽
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//[4]開始播放
mediaPlayer.start();
//[5]繼續(xù)上次的位置繼續(xù)播放
mediaPlayer.seekTo(currentPosition);
}
});
} catch (Exception e) {
e.printStackTrace();}}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
});
使用VideoView播放視頻
// 插件vitamio框架檢查是否可用
if (!LibsChecker.checkVitamioLibs(this)) {
return;
}
final VideoView vv = (VideoView) findViewById(R.id.vv);
vv.setVideoPath("http://192.168.11.86:8080/aa.avi");
vv.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
vv.start();
}
});
//設(shè)置video的控制器
vv.setMediaController(new MediaController(this));