android中使用SurfaceView做视频播放器--视频切换无缝连接

Android中的视频用到的有view.SurfaceHolder和view.SurfaceView,还有就是用到了MediaPlayer.OnBufferingUpdateListener和MediaPlayer.OnBufferingUpdateListener这里就是视频的主要的代码。

Java代码:主类

  1. package com.example.testmediaplayer;

  2. import android.app.Activity;
  3. import android.media.AudioManager;
  4. import android.media.MediaPlayer;
  5. import android.media.MediaPlayer.OnBufferingUpdateListener;
  6. import android.media.MediaPlayer.OnCompletionListener;
  7. import android.os.Bundle;
  8. import android.os.Environment;
  9. import android.util.Log;
  10. import android.view.SurfaceHolder;
  11. import android.view.SurfaceView;

  12. public class MainActivity extends Activity implements

  13. OnBufferingUpdateListener, OnCompletionListener,
  14.                 MediaPlayer.OnPreparedListener, SurfaceHolder.Callback {
  15.         private static final String TAG = “Activity1”;
  16.         private int mVideoWidth;
  17.         private int mVideoHeight;
  18.         private MediaPlayer mMediaPlayer;
  19.         private SurfaceView mPreview;
  20.         private SurfaceHolder holder;
  21.         private String path;

  22.         public void onCreate(Bundle icicle) {
  23.                 super.onCreate(icicle);
  24.                 setContentView(R.layout.activity_main);

  25.                 mPreview = (SurfaceView) findViewById(R.id.surfaceView1);

  26.                 /* 得到SurfaceHolder对象 */
  27.                 holder = mPreview.getHolder();

  28.                 /* 设置回调函数 */
  29.                 holder.addCallback(this);

  30.                 /* 设置风格 */
  31.                 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  32.         }

  33.         private void playVideo() {
  34.                 try {
  35.                         path = Environment.getExternalStorageDirectory().getPath()
  36.                                         + “/pandora-19.mov”;

  37.                         /* 构建MediaPlayer对象 */
  38.                         mMediaPlayer = new MediaPlayer();

  39.                         /* 设置媒体文件路径 */
  40.                         mMediaPlayer.setDataSource(path);

  41.                         /* 设置通过SurfaceView来显示画面 */
  42.                         mMediaPlayer.setDisplay(holder);

  43.                         /* 准备 */
  44.                         mMediaPlayer.prepare();

  45.                         /* 设置事件监听 */
  46.                         mMediaPlayer.setOnBufferingUpdateListener(this);
  47.                         mMediaPlayer.setOnCompletionListener(this);
  48.                         mMediaPlayer.setOnPreparedListener(this);
  49.                         mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

  50.                 } catch (Exception e) {
  51.                         Log.e(TAG, “error: ” + e.getMessage(), e);
  52.                 }
  53.         }

  54.         public void onBufferingUpdate(MediaPlayer arg0, int percent) {
  55.                 Log.d(TAG, “onBufferingUpdate percent:” + percent);
  56.         }

  57.         public void onCompletion(MediaPlayer arg0) {
  58.                 Log.d(TAG, “onCompletion called”);
  59.                 mMediaPlayer.reset();
  60.                 playVideo();
  61.         }

  62.         public void onPrepared(MediaPlayer mediaplayer) {
  63.                 Log.d(TAG, “onPrepared called”);
  64.                 mVideoWidth = mMediaPlayer.getVideoWidth();
  65.                 mVideoHeight = mMediaPlayer.getVideoHeight();

  66.                 if (mVideoWidth != 0 && mVideoHeight != 0) {

  67.                         /* 设置视频的宽度和高度 */
  68.                         holder.setFixedSize(mVideoWidth, mVideoHeight);

  69.                         /* 开始播放 */
  70.                         mMediaPlayer.start();
  71.                 }

  72.         }

  73.         /* 更改时出发的事件 */
  74.         public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
  75.                 Log.d(TAG, “surfaceChanged called”);

  76.         }

  77.         /* 销毁 */
  78.         public void surfaceDestroyed(SurfaceHolder surfaceholder) {
  79.                 Log.d(TAG, “surfaceDestroyed called”);
  80.         }

  81.         /* 当SurfaceHolder创建时触发 */
  82.         public void surfaceCreated(SurfaceHolder holder) {
  83.                 Log.d(TAG, “surfaceCreated called”);
  84.                 playVideo();
  85.         }

  86.         /* 销毁 */
  87.         @Override
  88.         protected void onDestroy() {
  89.                 super.onDestroy();

  90.                 if (mMediaPlayer != null) {
  91.                         mMediaPlayer.release();
  92.                         mMediaPlayer = null;
  93.                 }

  94.         }
  95. }

复制代码
main.xml文件

  1. <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  2.     xmlns:tools=”http://schemas.android.com/tools”
  3.     android:layout_width=”match_parent”
  4.     android:layout_height=”match_parent”
  5.     android:paddingBottom=”@dimen/activity_vertical_margin”
  6.     android:paddingLeft=”@dimen/activity_horizontal_margin”
  7.     android:paddingRight=”@dimen/activity_horizontal_margin”
  8.     android:paddingTop=”@dimen/activity_vertical_margin”
  9.     tools:context=”.MainActivity” >

  10.     <SurfaceView
  11.         android:id=”@+id/surfaceView1″
  12.         android:layout_width=”fill_parent”
  13.         android:layout_height=”fill_parent”/>

  14. </RelativeLayout>

复制代码
注意:在onDestory方法中一定要销毁mediaplayer对象

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/bsmmaoshenbo/article/details/41866763
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞