您的位置:首页 > 移动开发 > Android开发

SurfaceView在线视频播放

2015-12-15 11:26 561 查看
Android中的3中视频播放方式:

A自带的播放器。指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。

BVideoView播放。在布局文件中使用VideoView结合MediaController来实现对其控制。

C使用MediaPlayer类和SurfaceView来实现,这种方式很灵活。

前两种都比较简单和理解,今天进SurfaceView在线播放视频来进行讲解。

1.首先,来看一下布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.rocky.utouu.PlayerActivity">

<SurfaceView
android:id="@+id/vedio_surfaceview"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<TextView
android:id="@+id/play_back"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="20dp"
android:layout_marginRight="20dp"
android:background="@drawable/playshow_shape"
android:gravity="center"
android:text="返回"
android:textColor="#fff"
android:textSize="17sp"
android:visibility="gone" />
</RelativeLayout>

没什么好说的,就是个surfaceView和一个返回按钮,我没给按钮添加以一些自定义的背景样式

2.我们是来进行视屏横屏全屏播放,那么就要设置隐藏标题栏,因为它的确是太丑了,有能力的话可以去使用google推出的design包下的Toolbar来自定义自己的标题栏

<!-- 设置没有标题栏和title-->
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>

清单文件中设置Activity为横屏,还有要添加网络访问权限,这里就不上代码了

<!-- s视屏横屏播放-->
<activity
android:name=".MainActivity"
android:launchMode="singleTask"
android:screenOrientation="landscape">...</activity>

3.重点来了,一大堆代码来袭

MainActivity.java

public class MainActivity extends AppCompatActivity implements
MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener,
MediaPlayer.OnVideoSizeChangedListener, SurfaceHolder.Callback, View.OnClickListener {

private int mVideoWidth;
private int mVideoHeight;
private MediaPlayer mMediaPlayer;
private SurfaceHolder holder;
private String path;
private boolean mIsVideoSizeKnown = false;
private boolean mIsVideoReadyToBePlayed = false;
private SurfaceView surfaceView;
private TextView play_back;

@Override
protected void onCreate(Bundle savedInstanceState) {
//设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//视频地址
path="http://api.utouu.com/video/mobile/1449825853853.mp4";
surfaceView = ((SurfaceView) findViewById(R.id.vedio_surfaceview));
play_back = ((TextView) findViewById(R.id.play_back));
play_back.setOnClickListener(this);
holder = surfaceView.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

@Override
protected void onResume() {
//设置为横屏
if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
startVideoPlayback();
}
super.onResume();
}

@Override
protected void onPause() {
super.onPause();
releaseMediaPlayer();
doCleanUp();
}

@Override
protected void onDestroy() {
super.onDestroy();
releaseMediaPlayer();
doCleanUp();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
Log.v("tag", " == ---ConfigurationChanged");
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i("tag", "-------->surfareCreated开始播放");
playVideo();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.i("tag", "------->surfaceChanged");
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i("tag", "------->surfaceDestroyed");
}

@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
Log.i("tag", "----->缓冲" + percent + "%");
if (percent == 100) {
Toast.makeText(this, "缓存完毕", Toast.LENGTH_SHORT).show();
}
}

@Override
public void onCompletion(MediaPlayer mp) {
Log.i("tag", "----->oncompletion");
Toast.makeText(this, "播放完毕", Toast.LENGTH_SHORT).show();
play_back.setVisibility(View.VISIBLE);
}

@Override
public void onPrepared(MediaPlayer mp) {
Log.i("tag", "----->onprepared");
mIsVideoReadyToBePlayed = true;
if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
startVideoPlayback();
}
}

@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
Log.i("tag", "----->onVedioSizeChanged");
if (width == 0 || height == 0) {
Log.e("tag", "invalid video width(" + width + ") or height(" + height + ")");
return;
}
mIsVideoSizeKnown = true;
mVideoWidth = width;
mVideoHeight = height;
if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
startVideoPlayback();

9d0b
}
}

private void playVideo() {
doCleanUp();
try {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(path);
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepare();
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnVideoSizeChangedListener(this);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

} catch (Exception e) {
Log.i("tag", "error: " + e.getMessage(), e);
}
}

private void doCleanUp() {
mVideoWidth = 0;
mVideoHeight = 0;
mIsVideoReadyToBePlayed = false;
mIsVideoSizeKnown = false;
}

private void startVideoPlayback() {
Log.v("tag", "-------->startVideoPlayback");
holder.setFixedSize(mVideoWidth, mVideoHeight);
mMediaPlayer.start();

}

private void releaseMediaPlayer() {
if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}
}

@Override
public void onClick(View v) {
int itemid = v.getId();
switch (itemid) {
case R.id.play_back:
finish();
break;
}
}
}

最后我们来看一下效果图吧



好了,具体的我在来补充,先去吃饭了,改天再战!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息