1,activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<SurfaceView android:id="@+id/surface"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center">
</SurfaceView>
</LinearLayout>
2.MainActivity
package com.xxexample.myvideodemo;
import java.io.IOException;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.support.v4.app.NavUtils;
public class MainActivity extends Activity implements
OnBufferingUpdateListener, OnCompletionListener,
MediaPlayer.OnPreparedListener, SurfaceHolder.Callback {
private MediaPlayer mediaPlayer;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private int videoWidth;
private int videoHeight;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().setDisplayHomeAsUpEnabled(true);
this.surfaceView = (SurfaceView) this.findViewById(R.id.surface);
this.surfaceHolder = this.surfaceView.getHolder();
this.surfaceHolder.addCallback(this);
this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
Log.v("mplayer", ">>>create ok.");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
private void playVideo() throws IllegalArgumentException,
IllegalStateException, IOException {
this.mediaPlayer = new MediaPlayer();
//這個是優酷視頻:http://v.youku.com/player/getRealM3U8/vid/XNDUxNTYyNjI0/type//video.m3u8,它的id會根據時間而改變,所以有時測試失敗,就是視頻有效時間段過了(這東西困了我一天時間,哈哈)
下面代碼中的視頻是固定的,每次測試都成功:
String path3 = "http://mediamotiononline.ios.internapcdn.net/mediamotiononline/inapcms/CMS16042/flash/16042_adaptive2.mp4.m3u8";
this.mediaPlayer.setDataSource(path3);
this.mediaPlayer.setDisplay(this.surfaceHolder);
this.mediaPlayer.prepare();
this.mediaPlayer.start();
this.mediaPlayer.setOnBufferingUpdateListener(this);
this.mediaPlayer.setOnPreparedListener(this);
//this.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
Log.v("mplayer", ">>>play video");
}
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
try {
this.playVideo();
} catch (Exception e) {
Log.e("mplayer", ">>>error", e);
}
Log.v("mplayer", ">>>surface created");
}
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
public void onPrepared(MediaPlayer arg0) {
// TODO Auto-generated method stub
this.videoWidth = this.mediaPlayer.getVideoWidth();
this.videoHeight = this.mediaPlayer.getVideoHeight();
if (this.videoHeight != 0 && this.videoWidth != 0) {
this.surfaceHolder.setFixedSize(this.videoWidth, this.videoHeight);
this.mediaPlayer.start();
}
}
public void onCompletion(MediaPlayer arg0) {
// TODO Auto-generated method stub
}
public void onBufferingUpdate(MediaPlayer arg0, int arg1) {
// TODO Auto-generated method stub
}
}