• Android开发之MediaPlayer和SurfaceView组成视频播放器


    SurfaceView 

    • 使用双缓冲技术
    • 是个重量级的组件
    • 只要不可见,就不会创建,可见时,才会创建
    • 只要不可见,就会销毁

     SurfaceView一旦不可见,就会被销毁,一旦可见,就会被创建,销毁时停止播放,再次创建时再开始播放

     1 import android.app.Activity;
     2 import android.media.MediaPlayer;
     3 import android.os.Bundle;
     4 import android.view.SurfaceHolder;
     5 import android.view.SurfaceHolder.Callback;
     6 import android.view.SurfaceView;
     7 
     8 public class MainActivity extends Activity {
     9     private MediaPlayer player;
    10     static int currentPosition;
    11 
    12     @Override
    13     protected void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         setContentView(R.layout.activity_main);
    16 
    17         SurfaceView sv = (SurfaceView) findViewById(R.id.sv);
    18         // 拿到surfaceview的控制器
    19         final SurfaceHolder sh = sv.getHolder();
    20         //给SurfaceHolder设置CallBack,类似于侦听,可以知道SurfaceView的状态
    21         sh.addCallback(new Callback() {
    22             // surfaceView销毁时调用
    23             @Override
    24             public void surfaceDestroyed(SurfaceHolder holder) {
    25                 // 每次surfaceview销毁时,同时停止播放视频
    26                 if (player != null) {
    27                     currentPosition = player.getCurrentPosition();
    28                     player.stop();
    29                     player.release();
    30                     player = null;
    31                 }
    32             }
    33 
    34             // surfaceView创建时调用
    35             @Override
    36             public void surfaceCreated(SurfaceHolder holder) {
    37                 // 每次surfaceView创建时才去播放视频
    38                 if (player == null) {
    39                     player = new MediaPlayer();
    40                     player.reset();
    41                     try {
    42                         player.setDataSource("sdcard/2.3gp");
    43                         player.setDisplay(sh);
    44                         player.prepare();
    45                         player.start();
    46                         player.seekTo(currentPosition);
    47                     } catch (Exception e) {
    48                         e.printStackTrace();
    49                     }
    50                 }
    51 
    52             }
    53 
    54             // surfaceView结构改变时调用
    55             @Override
    56             public void surfaceChanged(SurfaceHolder holder, int format,
    57                     int width, int height) {
    58             }
    59         });
    60     }
    61 }
  • 相关阅读:
    使用MingGW-w64 Build Script 3.6.7搭建ffmpeg编译环境
    ffmpeg精简编译
    CListCtrl死锁的问题
    VC程序禁用提示框
    rtmp协议分析
    [置顶] zabbix发送告警
    [置顶] 个人微信号发送zabbix告警信息
    [置顶] 一个简单好用的zabbix告警信息发送工具
    [置顶] zabbix告警信息-lykchat信息发送系统
    模拟登陆web微信的流程和参数细节
  • 原文地址:https://www.cnblogs.com/liyiran/p/5098412.html
Copyright © 2020-2023  润新知