beea86beccf7ca7f9f6dbee88f40c77895faaa13.svn-base 6.99 KB
/**
 * @author 郎咸智
 * 上午9:57:30
 */
package com.ivt.android.me.utils.seeliveutil;

import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.content.Context;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;

import com.ksyun.media.player.IMediaPlayer;
import com.ksyun.media.player.KSYMediaPlayer;

/**
 * @author 郎咸智
 * @version 创建时间:2016-8-23 上午9:57:30 金山云推流工具
 */
public class KSYSeeLiveUtil {
	private static KSYSeeLiveUtil ksyutils = new KSYSeeLiveUtil();
	private KSYMediaPlayer ksyMediaPlayer;

	private SurfaceView mVideoSurfaceView = null;
	private SurfaceHolder mSurfaceHolder = null;
	private Context context;

	// 直播参数

	private int mVideoWidth = 0;
	private int mVideoHeight = 0;

	ExecutorService executorService;
	private String url;

	synchronized public static KSYSeeLiveUtil getInstance() {
		return ksyutils;
	}

	private KSYSeeLiveUtil() {
		executorService = Executors.newSingleThreadExecutor();
	}

	/**
	 * 初始化金山云推流工具
	 *
	 * @param url
	 *            推流地址
	 * @param context
	 * @param gsfv
	 */
	public void InitKSYUpLive(String url, Context context, SurfaceView gsfv) {
		this.url = url;
		mVideoSurfaceView = gsfv;
		this.context = context;
		mSurfaceHolder = mVideoSurfaceView.getHolder();
		mSurfaceHolder.addCallback(mSurfaceCallback);
		mVideoSurfaceView.setOnTouchListener(mTouchListener);
		mVideoSurfaceView.setKeepScreenOn(true);

		ksyMediaPlayer = new KSYMediaPlayer.Builder(context).build();
		ksyMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
		ksyMediaPlayer.setOnCompletionListener(mOnCompletionListener);
		ksyMediaPlayer.setOnPreparedListener(mOnPreparedListener);
		ksyMediaPlayer.setOnInfoListener(mOnInfoListener);
		ksyMediaPlayer
				.setOnVideoSizeChangedListener(mOnVideoSizeChangeListener);
		ksyMediaPlayer.setOnErrorListener(mOnErrorListener);
		ksyMediaPlayer.setOnSeekCompleteListener(mOnSeekCompletedListener);
		ksyMediaPlayer.setScreenOnWhilePlaying(true);
		ksyMediaPlayer.setBufferTimeMax(5);
		ksyMediaPlayer.setTimeout(20, 100);

		try {
			ksyMediaPlayer.setDataSource(this.url);
			ksyMediaPlayer.prepareAsync();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private IMediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener = new IMediaPlayer.OnBufferingUpdateListener() {
		@Override
		public void onBufferingUpdate(IMediaPlayer mp, int percent) {
			long duration = ksyMediaPlayer.getDuration();
			long progress = duration * percent / 100;
			// mPlayerSeekbar.setSecondaryProgress((int)progress);
		}
	};

	private IMediaPlayer.OnInfoListener mOnInfoListener = new IMediaPlayer.OnInfoListener() {
		@Override
		public boolean onInfo(IMediaPlayer iMediaPlayer, int i, int i1) {
			switch (i) {
			case KSYMediaPlayer.MEDIA_INFO_BUFFERING_START:
				// Log.d(TAG, "Buffering Start.");
				break;
			case KSYMediaPlayer.MEDIA_INFO_BUFFERING_END:
				// Log.d(TAG, "Buffering End.");
				break;
			case KSYMediaPlayer.MEDIA_INFO_AUDIO_RENDERING_START:
				// Toast.makeText(mContext, "Audio Rendering Start",
				// Toast.LENGTH_SHORT).show();
				break;
			case KSYMediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
				// Toast.makeText(mContext, "Video Rendering Start",
				// Toast.LENGTH_SHORT).show();
				break;
			case KSYMediaPlayer.MEDIA_INFO_SUGGEST_RELOAD:
				// Player find a new stream(video or audio), and we could reload
				// the video.
				// if (ksyMediaPlayer != null)
				// ksyMediaPlayer.reload(mDataSource, false);
				break;
			case KSYMediaPlayer.MEDIA_INFO_RELOADED:
				// Toast.makeText(mContext, "Succeed to reload video.",
				// Toast.LENGTH_SHORT).show();
				// Log.d(TAG, "Succeed to reload video.");
				return false;
			}
			return false;
		}
	};

	private IMediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangeListener = new IMediaPlayer.OnVideoSizeChangedListener() {
		@Override
		public void onVideoSizeChanged(IMediaPlayer mp, int width, int height,
				int sarNum, int sarDen) {
			if (mVideoWidth > 0 && mVideoHeight > 0) {
				if (width != mVideoWidth || height != mVideoHeight) {
					mVideoWidth = mp.getVideoWidth();
					mVideoHeight = mp.getVideoHeight();

					if (ksyMediaPlayer != null)
						ksyMediaPlayer
								.setVideoScalingMode(KSYMediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
				}
			}
		}
	};

	private IMediaPlayer.OnSeekCompleteListener mOnSeekCompletedListener = new IMediaPlayer.OnSeekCompleteListener() {
		@Override
		public void onSeekComplete(IMediaPlayer mp) {
			// Log.e(TAG, "onSeekComplete...............");
		}
	};

	private IMediaPlayer.OnCompletionListener mOnCompletionListener = new IMediaPlayer.OnCompletionListener() {
		@Override
		public void onCompletion(IMediaPlayer mp) {
			// Toast.makeText(mContext, "OnCompletionListener, play complete.",
			// Toast.LENGTH_LONG).show();
			// videoPlayEnd();
		}
	};

	private IMediaPlayer.OnErrorListener mOnErrorListener = new IMediaPlayer.OnErrorListener() {
		@Override
		public boolean onError(IMediaPlayer mp, int what, int extra) {
			switch (what) {
			case KSYMediaPlayer.MEDIA_ERROR_UNKNOWN:
				// Log.e(TAG, "OnErrorListener, Error Unknown:" + what +
				// ",extra:"
				// + extra);
				break;
			default:
				// Log.e(TAG, "OnErrorListener, Error:" + what + ",extra:" +
				// extra);
			}
			// videoPlayEnd();
			return false;
		}
	};

	private final Callback mSurfaceCallback = new Callback() {
		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height) {
			if (ksyMediaPlayer != null && ksyMediaPlayer.isPlaying())
				ksyMediaPlayer
						.setVideoScalingMode(KSYMediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
		}

		@Override
		public void surfaceCreated(SurfaceHolder holder) {
			if (ksyMediaPlayer != null)
				ksyMediaPlayer.setDisplay(holder);
		}

		@Override
		public void surfaceDestroyed(SurfaceHolder holder) {
			if (ksyMediaPlayer != null) {
				ksyMediaPlayer.setDisplay(null);
			}
		}
	};

	private View.OnTouchListener mTouchListener = new View.OnTouchListener() {
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			// dealTouchEvent(v, event);
			return false;
		}
	};

	private IMediaPlayer.OnPreparedListener mOnPreparedListener = new IMediaPlayer.OnPreparedListener() {
		@Override
		public void onPrepared(IMediaPlayer mp) {

			mVideoWidth = ksyMediaPlayer.getVideoWidth();
			mVideoHeight = ksyMediaPlayer.getVideoHeight();
			// Set Video Scaling Mode
			ksyMediaPlayer
					.setVideoScalingMode(KSYMediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
			// start player
			ksyMediaPlayer.start();

			// // set progress
			// setVideoProgress(0);
		}
	};

	public void videoPlayEnd() {
		if (ksyMediaPlayer != null) {
			ksyMediaPlayer.release();
			ksyMediaPlayer = null;
		}
	}

	public KSYMediaPlayer GetKSYPlayer() {
		if (ksyMediaPlayer != null) {
			return ksyMediaPlayer;
		}
		return null;
	}

}