Android 学习使用 SurfaceView 和 MediaPlayer 播放视频

7 篇文章 0 订阅
本文介绍了如何在Android中使用SurfaceView进行视频播放,并实现暂停、播放、静音、音量控制、通知栏展示及尺寸调整等功能。通过MediaPlayer实例操作,展示了多媒体文件的加载、缓冲更新监听和预加载完成后的处理。
摘要由CSDN通过智能技术生成

记录下自己学习用的demo , 具体分析后续补上。

package lah.surfaceviewdemo;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.TimedMetaData;
import android.media.TimedText;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;

import java.io.IOException;

public class MainActivity extends Activity implements View.OnClickListener {

    private Context mContext;

    private LinearLayout mLinearLayout;
    private Button bt_play, bt_pause, btn_mute, btn_unmute, btn_notify, btn_size;
    private SurfaceView mSurfaceView;
    private SurfaceHolder mHolder;
    private MediaPlayer mPlayer;

    private int windowWidth;
    private int windowHeight;

    private int videoWith;
    private int videoHeight;

    private int notification_id = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;

        //获取屏幕宽高
        WindowManager windowManager = this.getWindowManager();
        windowWidth = windowManager.getDefaultDisplay().getWidth();
        windowHeight = windowManager.getDefaultDisplay().getHeight();

        //获取屏幕宽高
        DisplayMetrics dm = getResources().getDisplayMetrics();
        Log.d("luoanhao", "[MainActivity.java] -- onCreate -- windowWidth:" + windowWidth);
        Log.d("luoanhao", "[MainActivity.java] -- onCreate -- windowHeight:" + windowHeight);
        Log.d("luoanhao", "[MainActivity.java] -- onCreate -- dm.heightPixels:" + dm.heightPixels);
        Log.d("luoanhao", "[MainActivity.java] -- onCreate -- dm.widthPixels:" + dm.widthPixels);

        initView();
        initPlayer();
    }

    private void initView() {
        mLinearLayout = (LinearLayout) findViewById(R.id.linearlayout_control);

        bt_play = (Button) findViewById(R.id.btn_play);
        bt_play.setOnClickListener(this);
        bt_pause = (Button) findViewById(R.id.btn_pause);
        bt_pause.setOnClickListener(this);
        btn_mute = (Button) findViewById(R.id.btn_mute);
        btn_mute.setOnClickListener(this);
        btn_unmute = (Button) findViewById(R.id.btn_unmute);
        btn_unmute.setOnClickListener(this);
        btn_notify = (Button) findViewById(R.id.btn_notify);
        btn_notify.setOnClickListener(this);
        btn_size = findViewById(R.id.btn_change_size);
        btn_size.setOnClickListener(this);

        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        mHolder = mSurfaceView.getHolder();
        mHolder.addCallback(new LahCallBack());
    }

    private void initPlayer() {
        mPlayer = new MediaPlayer();
        try {
            String uri = "android.resource://" + getPackageName() + "/" + R.raw.picture_setting_video;
            //String uri = "android.resource://" + getPackageName() + "/" + R.raw.video_test;
            //String uri = "https://waptest.chaojijiuxing.cn/ad?id=null";
            mPlayer.setDataSource(this, Uri.parse(uri));

//            File file = new File("mnt/usb/sda1/aaa_video/DCs.Legends.of.Tomorrow.arabic-ANSI.mkv");
//            if (file != null && file.exists()) {
//                mPlayer.setDataSource(file.toString());
//            }
            mPlayer.prepareAsync();

            videoWith = mPlayer.getVideoWidth();
            videoHeight = mPlayer.getVideoWidth();
            Log.d("luoanhao", "[MainActivity.java] -- initPlayer -- videoWith:" + videoWith);
            Log.d("luoanhao", "[MainActivity.java] -- initPlayer -- videoHeight:" + videoHeight);

            mPlayer.start();
        } catch (IOException e) {
            e.printStackTrace();
        }

        mPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
            @Override
            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                Log.d("luoanhao", "[MainActivity.java] -- onBufferingUpdate -- ");
            }
        });

        mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mPlayer.start();
                testTract();
                Log.d("luoanhao", "[MainActivity.java] -- onPrepared -- mPlayer.start()");
            }
        });

        mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                Log.d("luoanhao", "[MainActivity.java] -- onCompletion -- ");
                //mPlayer.start();
                //mPlayer.setLooping(true);
            }
        });

        mPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
            @Override
            public boolean onInfo(MediaPlayer mp, int what, int extra) {
                Log.d("luoanhao", "[MainActivity.java] -- onInfo -- what:" + what);
                Log.d("luoanhao", "[MainActivity.java] -- onInfo -- extra:" + extra);
                if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
                    mSurfaceView.setBackgroundColor(Color.TRANSPARENT);
                }

                return false;
            }
        });

        mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Log.d("luoanhao", "[MainActivity.java] -- onError -- what:" + what);
                Log.d("luoanhao", "[MainActivity.java] -- onError -- extra:" + extra);
                return false;
            }
        });

        mPlayer.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
            @Override
            public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
                Log.d("luoanhao", "[MainActivity.java] -- onVideoSizeChanged -- width" + width);
                Log.d("luoanhao", "[MainActivity.java] -- onVideoSizeChanged -- height" + height);
            }
        });

        mPlayer.setOnTimedTextListener(new MediaPlayer.OnTimedTextListener() {
            @Override
            public void onTimedText(MediaPlayer mp, TimedText text) {
                if (text != null) {
                    Log.d("luoanhao", "[MainActivity.java] -- onTimedText -- text.getText():" + text.getText());
                }
            }
        });

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
            mPlayer.setOnTimedMetaDataAvailableListener(new MediaPlayer.OnTimedMetaDataAvailableListener() {
                @Override
                public void onTimedMetaDataAvailable(MediaPlayer mp, TimedMetaData data) {
                    Log.d("luoanhao", "[MainActivity.java] -- onTimedMetaDataAvailable -- ");
                }
            });
        }
    }

    private void testTract() {
        if (mPlayer != null) {
            MediaPlayer.TrackInfo[] trackInfo = mPlayer.getTrackInfo();
            if (trackInfo != null && trackInfo.length > 0) {
                for (int i = 0; i < trackInfo.length; i++) {
                    MediaPlayer.TrackInfo info = trackInfo[i];
                    if (info.getTrackType() == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT) {
                        mPlayer.selectTrack(i);
                    }
                }
            }
        }
    }

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

    @Override
    protected void onStop() {
        if (mPlayer != null) {
            mPlayer.release();
            mPlayer = null;
        }
        super.onStop();
    }

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

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_play:
                mPlayer.start();
                break;
            case R.id.btn_pause:
                mPlayer.pause();
                break;
            case R.id.btn_mute:
                setMuteEnabled(true);
                break;
            case R.id.btn_unmute:
                setMuteEnabled(false);
                break;
            case R.id.btn_notify:
                showNotification();
                break;
            case R.id.btn_change_size:
                mSurfaceView.getHolder().setFixedSize(windowWidth,windowWidth*9/16);
                break;
            default:
                break;
        }
    }

    private class LahCallBack implements SurfaceHolder.Callback {
        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {
            Log.d("luoanhao", "[MainActivity.java] -- LahCallBack -- surfaceCreated -- ");
            mPlayer.setDisplay(surfaceHolder);
        }

        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
            Log.d("luoanhao", "[MainActivity.java] -- surfaceChanged -- format:" + format);
            Log.d("luoanhao", "[MainActivity.java] -- surfaceChanged -- width:" + width);
            Log.d("luoanhao", "[MainActivity.java] -- surfaceChanged -- height:" + height);
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

        }
    }

    private void setMuteEnabled(boolean enabled) {
        AudioManager mAudioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, enabled);
        } else {
            if (enabled) {
                mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_MUTE, AudioManager.FLAG_SHOW_UI);
            } else {
                mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_UNMUTE, AudioManager.FLAG_SHOW_UI);
            }
        }
    }

    private void showNotification() {
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mContext);

        //设置标题
        mBuilder.setContentTitle("我是标题")
                //设置内容
                .setContentText("我是内容")
                //设置大图标
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                //设置小图标
                .setSmallIcon(R.mipmap.ic_launcher_round)
                //设置通知时间
                .setWhen(System.currentTimeMillis())
                //首次进入时显示效果
                .setTicker("我是测试内容")
                //设置优先级
                .setPriority(Notification.PRIORITY_HIGH)
                //设置通知方式,声音,震动,呼吸灯等效果,这里通知方式为声音
                .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS);
        //发送通知请求
        notificationManager.notify(notification_id++, mBuilder.build());
    }

}

xml 布局,

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:context="lah.surfaceviewdemo.MainActivity">

    <SurfaceView
        android:id="@+id/surfaceview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <SeekBar
        android:layout_width="match_parent"
        android:layout_height="2dp"/>

    <LinearLayout
        android:id="@+id/linearlayout_control"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:id="@+id/btn_play"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_above="@+id/btn_pause"
                android:layout_centerHorizontal="true"
                android:background="@drawable/sel_btn"
                android:text="@string/play"/>

            <Button
                android:id="@+id/btn_pause"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_centerHorizontal="true"
                android:background="@drawable/sel_btn"
                android:text="@string/pause"/>

            <Button
                android:id="@+id/btn_change_size"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_centerHorizontal="true"
                android:background="@drawable/sel_btn"
                android:text="@string/size"/>

            <Button
                android:id="@+id/btn_mute"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_centerHorizontal="true"
                android:background="@drawable/sel_btn"
                android:text="@string/mute"/>

            <Button
                android:id="@+id/btn_unmute"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_centerHorizontal="true"
                android:background="@drawable/sel_btn"
                android:text="@string/unmute"/>

            <Button
                android:id="@+id/btn_notify"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_centerHorizontal="true"
                android:background="@drawable/sel_btn"
                android:text="@string/notify"/>

        </LinearLayout>

    </LinearLayout>
</FrameLayout>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值