1.MainActivity.java
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
public class MainActivity extends Activity {
static final String TAG = "NativeMedia";
// member variables for Java media player
MediaPlayer mMediaPlayer;
boolean mMediaPlayerIsPrepared = false;
SurfaceView mSurfaceView1;
SurfaceHolder mSurfaceHolder1;
VideoSink mSelectedVideoSink;
VideoSink mJavaMediaPlayerVideoSink;
SurfaceHolderVideoSink mSurfaceHolder1VideoSink;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// set up the Surface 1 video sink
mSurfaceView1 = (SurfaceView) findViewById(R.id.surfaceview1);
mSurfaceHolder1 = mSurfaceView1.getHolder();
// create Java media player
mMediaPlayer = new MediaPlayer();
if (mSurfaceHolder1VideoSink == null) {
mSurfaceHolder1VideoSink = new SurfaceHolderVideoSink(mSurfaceHolder1);
}
mSelectedVideoSink = mSurfaceHolder1VideoSink;
// set up Java media player listeners
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mediaPlayer) {
int width = mediaPlayer.getVideoWidth();
int height = mediaPlayer.getVideoHeight();
Log.v(TAG, "onPrepared width=" + width + ", height=" + height);
if (width != 0 && height != 0 && mJavaMediaPlayerVideoSink != null) {
mJavaMediaPlayerVideoSink.setFixedSize(width, height);
}
mMediaPlayerIsPrepared = true;
mediaPlayer.start();
}
});
mMediaPlayer.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
public void onVideoSizeChanged(MediaPlayer mediaPlayer, int width, int height) {
Log.v(TAG, "onVideoSizeChanged width=" + width + ", height=" + height);
if (width != 0 && height != 0 && mJavaMediaPlayerVideoSink != null) {
mJavaMediaPlayerVideoSink.setFixedSize(width, height);
}
}
});
// Java MediaPlayer start/pause
((Button) findViewById(R.id.start_java)).setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
if (mJavaMediaPlayerVideoSink == null) {
if (mSelectedVideoSink == null) {
return;
}
mSelectedVideoSink.useAsSinkForJava(mMediaPlayer);
mJavaMediaPlayerVideoSink = mSelectedVideoSink;
}
if (!mMediaPlayerIsPrepared) {
try {
mMediaPlayer.setDataSource("/sdcard/NativeMedia.ts"); // 视频的地址
} catch (IOException e) {
Log.e(TAG, "IOException " + e);
}
mMediaPlayer.prepareAsync();
} else if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
} else {
mMediaPlayer.start();
}
}
});
}
// VideoSink abstracts out the difference between Surface and SurfaceTexture
// aka SurfaceHolder and GLSurfaceView
static abstract class VideoSink {
abstract void setFixedSize(int width, int height);
abstract void useAsSinkForJava(MediaPlayer mediaPlayer);
}
static class SurfaceHolderVideoSink extends VideoSink {
private final SurfaceHolder mSurfaceHolder;
SurfaceHolderVideoSink(SurfaceHolder surfaceHolder) {
mSurfaceHolder = surfaceHolder;
}
void setFixedSize(int width, int height) {
mSurfaceHolder.setFixedSize(width, height);
}
void useAsSinkForJava(MediaPlayer mediaPlayer) {
// Use the newer MediaPlayer.setSurface(Surface) since API level 14
// instead of MediaPlayer.setDisplay(mSurfaceHolder) since API level 1,
// because setSurface also works with a Surface derived from a SurfaceTexture.
Surface s = mSurfaceHolder.getSurface();
mediaPlayer.setSurface(s);
s.release();
}
}
}
2.activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" > <Button android:id="@+id/start_java" android:text="@string/start_java" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="S1" /> <SurfaceView android:id="@+id/surfaceview1" android:layout_width="320px" android:layout_height="240px" /> </LinearLayout> </LinearLayout>