android 98 MediaPlayer+SurfaceView播放视频

简介:

package com.itheima.videoplayer;


import java.io.IOException;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class MainActivity extends Activity {
    private MediaPlayer player;//只能播放MP4和3gp格式视频
    static int currentPosition;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);//SurfaceView标签要先显示在页面才能使用,因此要另外开启一个线程睡一会让布局生成了再去使用SurfaceView对象。
        SurfaceView sv = (SurfaceView) findViewById(R.id.sv);//视频播放画面
        //拿到surfaceview的控制器
        final SurfaceHolder sh = sv.getHolder();
//        Thread t = new Thread(){
//            @Override
//            public void run() {
//                try {
//                    sleep(200);        //200毫秒不能写死
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                runOnUiThread(new Runnable() {   //在主线程去执行
//                    @Override
//                    public void run() {
//                        MediaPlayer player = new MediaPlayer();
//                        player.reset();
//                        try {
//                            player.setDataSource("sdcard/2.3gp");
//                            player.setDisplay(sh);
//                            player.prepare();
//                            player.start();
//                        } catch (Exception e) {
//                            e.printStackTrace();
//                        } 
//                    }
//                });
//            }
//        };
//        t.start();
        sh.addCallback(new Callback() {
            //surfaceView销毁时调用
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                //每次surfaceview销毁时,同时停止播放视频
                if(player != null){
                    currentPosition = player.getCurrentPosition();
                    player.stop();
                    player.release();
                    player = null;
                }
            }
            //surfaceView创建时调用surfaceView可见时调用
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                //每次surfaceView创建时才去播放视频
                if(player == null){
                    player = new MediaPlayer();
                    player.reset();
                    try {
                        player.setDataSource("sdcard/2.3gp");
                        player.setDisplay(sh);
                        player.prepare();
                        player.start();
                        player.seekTo(currentPosition);
                    } catch (Exception e) {
                        e.printStackTrace();
                    } 
                }
            }
            //surfaceView结构改变时调用
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width,
                    int height) {
            }
        });
    }
}
/*页面:
<SurfaceView
    android:id="@+id/sv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>
---
#视频播放器
##SurfaceView
* 对画面的实时更新要求较高
* 双缓冲技术:内存中有两个画布,A画布显示至屏幕,B画布在内存中绘制下一帧画面,绘制完毕后B显示至屏幕,A在内存中继续绘制下一帧画面
* 播放视频也是用MediaPlayer,不过跟音频不同,要设置显示在哪个SurfaceView
 */
复制代码

 vitamio播放视频:

 

复制代码
package com.itheima.videoview;

import io.vov.vitamio.LibsChecker;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //检测是否支持vitamio,没有安装就安装
        if (!LibsChecker.checkVitamioLibs(this)) {return;}
        VideoView vv = (VideoView) findViewById(R.id.vv);
        vv.setVideoPath("sdcard/4.rmvb");
        vv.start();
        vv.setMediaController(new MediaController(this));//视频播放控制器
    }
}
/*
###SurfaceView
* 双缓冲技术
* 重量级组件(占用资源多)
* 只要不可见,就不会创建,可见时,才会创建
* 只要不可见,就会销毁
### FFMPEG
* 开源免费的音视频编解码器,用C语言开发。
### Vitamio
* 封装了FFMPEG的视频播放框架
* 对外提供的api全部都是javaApi*/
/*<io.vov.vitamio.widget.VideoView
    android:id="@+id/vv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>*/
//清单文件:<activity android:name="io.vov.vitamio.activity.InitActivity"></activity>
复制代码

 

  


复制代码
package com.itheima.videoplayer;

import java.io.IOException;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class MainActivity extends Activity {
    private MediaPlayer player;//只能播放MP4和3gp格式视频
    static int currentPosition;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);//SurfaceView标签要先显示在页面才能使用,因此要另外开启一个线程睡一会让布局生成了再去使用SurfaceView对象。
        SurfaceView sv = (SurfaceView) findViewById(R.id.sv);//视频播放画面
        //拿到surfaceview的控制器
        final SurfaceHolder sh = sv.getHolder();
//        Thread t = new Thread(){
//            @Override
//            public void run() {
//                try {
//                    sleep(200);        //200毫秒不能写死
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                runOnUiThread(new Runnable() {   //在主线程去执行
//                    @Override
//                    public void run() {
//                        MediaPlayer player = new MediaPlayer();
//                        player.reset();
//                        try {
//                            player.setDataSource("sdcard/2.3gp");
//                            player.setDisplay(sh);
//                            player.prepare();
//                            player.start();
//                        } catch (Exception e) {
//                            e.printStackTrace();
//                        } 
//                    }
//                });
//            }
//        };
//        t.start();
        sh.addCallback(new Callback() {
            //surfaceView销毁时调用
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                //每次surfaceview销毁时,同时停止播放视频
                if(player != null){
                    currentPosition = player.getCurrentPosition();
                    player.stop();
                    player.release();
                    player = null;
                }
            }
            //surfaceView创建时调用surfaceView可见时调用
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                //每次surfaceView创建时才去播放视频
                if(player == null){
                    player = new MediaPlayer();
                    player.reset();
                    try {
                        player.setDataSource("sdcard/2.3gp");
                        player.setDisplay(sh);
                        player.prepare();
                        player.start();
                        player.seekTo(currentPosition);
                    } catch (Exception e) {
                        e.printStackTrace();
                    } 
                }
            }
            //surfaceView结构改变时调用
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width,
                    int height) {
            }
        });
    }
}
/*页面:
<SurfaceView
    android:id="@+id/sv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>
---
#视频播放器
##SurfaceView
* 对画面的实时更新要求较高
* 双缓冲技术:内存中有两个画布,A画布显示至屏幕,B画布在内存中绘制下一帧画面,绘制完毕后B显示至屏幕,A在内存中继续绘制下一帧画面
* 播放视频也是用MediaPlayer,不过跟音频不同,要设置显示在哪个SurfaceView
 */
复制代码

 vitamio播放视频:

 

复制代码
package com.itheima.videoview;

import io.vov.vitamio.LibsChecker;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //检测是否支持vitamio,没有安装就安装
        if (!LibsChecker.checkVitamioLibs(this)) {return;}
        VideoView vv = (VideoView) findViewById(R.id.vv);
        vv.setVideoPath("sdcard/4.rmvb");
        vv.start();
        vv.setMediaController(new MediaController(this));//视频播放控制器
    }
}
/*
###SurfaceView
* 双缓冲技术
* 重量级组件(占用资源多)
* 只要不可见,就不会创建,可见时,才会创建
* 只要不可见,就会销毁
### FFMPEG
* 开源免费的音视频编解码器,用C语言开发。
### Vitamio
* 封装了FFMPEG的视频播放框架
* 对外提供的api全部都是javaApi*/
/*<io.vov.vitamio.widget.VideoView
    android:id="@+id/vv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>*/
//清单文件:<activity android:name="io.vov.vitamio.activity.InitActivity"></activity>
复制代码

 

  

本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4966674.html,如需转载请自行联系原作者 

相关文章
|
4月前
|
XML Java Android开发
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
74 0
|
7月前
|
前端开发 开发工具 Android开发
Android播放器之SurfaceView与GLSurfaceView
Surface的官方介绍:Handle onto a raw buffer that is being managed by the screen compositor,Surface是一个raw buffer的句柄,通过它在raw buffer上进行绘制,可以通过Surface获得一个Canvas。
119 0
|
4月前
|
XML 存储 Java
Android 开发音频录播中媒体录制器MediaRecorder和媒体播放器MediaPlayer的讲解及实战(超详细 附源码)
Android 开发音频录播中媒体录制器MediaRecorder和媒体播放器MediaPlayer的讲解及实战(超详细 附源码)
42 0
|
8月前
|
Android开发
Android 使用MediaPlayer和SurfaceView播放视频
Android 使用MediaPlayer和SurfaceView播放视频
68 0
|
9月前
|
前端开发 安全 Android开发
|
Android开发
Android 裁剪摄像头预览窗口-SurfaceView
Android 裁剪摄像头预览窗口-SurfaceView
541 0
Android 裁剪摄像头预览窗口-SurfaceView
|
Android开发
全志H6 Android 9 MediaPlayer兼容问题
全志H6 Android 9 MediaPlayer兼容问题
110 0
|
前端开发 Java Linux
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
197 0
|
Android开发
Android MediaPlayer 播放prepareAsync called in state 8解决办法
Android MediaPlayer 播放prepareAsync called in state 8解决办法
185 0