SurfaceView在线视频播放

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();
        }
    }

    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;
        }
    }
}

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


好了,具体的我在来补充,先去吃饭了,改天再战!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值