Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android視頻播放心得體會

android視頻播放心得體會

編輯:關於Android編程

android視頻播放主要是兩種方式1、系統封裝好的videoplayer,有前進、後退、暫停/播放、拉動最基本的功能,夠一般使用,操作辦法也很簡單,如果需要自定義程度高就需要用到第二種方法:SurfaceView+mediaplayer,顯示通過surfaceView,使mediaplayer和surfaceview綁定

SurfaceView+mediaplayer,主要操作辦法:1、監聽surfaceview回調函數,等待surfaceview初始化完畢

surface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		surface.getHolder().addCallback(new Callback() {// surface初始化的回調
					// 發生改變
					public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
					}

					// 創建完成
					public void surfaceCreated(SurfaceHolder holder) {
						Log.e("media", "surfaceView創建完成!");
						preMediaplayer();
					}

					// 銷毀
					public void surfaceDestroyed(SurfaceHolder holder) {
					}
				});
2、初始化完畢後就可以對mediaplayer進行操作了,需要了解mediaplayer的生命周期圖

\


if (SinoAppliacation.mediaPlayer == null) {
			SinoAppliacation.mediaPlayer = new MediaPlayer();
		}
		try {
			SinoAppliacation.mediaPlayer.reset();
			SinoAppliacation.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
			SinoAppliacation.mediaPlayer.setDisplay(surface.getHolder());
			SinoAppliacation.mediaPlayer.setDataSource(url);
			SinoAppliacation.mediaPlayer.setLooping(true);
			SinoAppliacation.mediaPlayer.prepareAsync();
幾項最基本的初始化操作,包括設置聲音、和surfaceview綁定、設置播放地址、循環播放,異步准備。

在做幾項最基本的監聽:

SinoAppliacation.mediaPlayer.setOnInfoListener(new OnInfoListener() {// 等待緩沖監聽
						@Override
						public boolean onInfo(MediaPlayer mp, int what, int extra) {
							switch (what) {
							case MediaPlayer.MEDIA_INFO_BUFFERING_START:
								loading.setVisibility(View.VISIBLE);
								break;
							case MediaPlayer.MEDIA_INFO_BUFFERING_END:
								// 緩存完成,繼續播放
								loading.setVisibility(View.INVISIBLE);
								break;
							}
							return true;
						}
					});
			SinoAppliacation.mediaPlayer.setOnErrorListener(new OnErrorListener() {
				@Override
				public boolean onError(MediaPlayer mp, int what, int extra) {
					mCurrentState = STATE_ERROR;
					Log.e("mediaplay", "error");
					Toast.makeText(BaseVideoPlayActivity.this, "親,視頻出錯了!", 0).show();
					return false;
				}
			});
			SinoAppliacation.mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
				@Override
				public void onPrepared(MediaPlayer mp) {
					initTimeAndBar();
					SinoAppliacation.mediaPlayer.start();
				}
			});
		} catch (Exception e) {
			Log.e("media", e + "");
		}

這裡做了三項監聽,當然還有其他監聽這裡不需要了。第一個是等待緩沖監聽,當滑動進度條後還沒有及時加載需要顯示個progressbar就可以在這裡設置。第二個是錯誤監聽,當視頻播放出錯可以給用戶提示。第三項是最重要的,當onPrepared時才是mediaplayer准備完畢可以進行播放了,通過調用start()方法執行播放。通過Pause()暫停。

基本就這些

做的過程中遇到的問題及解決辦法:

1、加載時的監聽。有兩種方式,一個是加載的進度占總進度的比例,一般可以用兩個進度條去做加載狀態,可以 通過mediaplayer的mediaPlayer.setOnBufferingUpdateListener來監聽。如果是拖動還未加載出當前視頻,可以通過setOnInfoListener來監聽。

2、豎屏切換橫屏。有很多人提出這樣的需求,但是貌似沒有很好的解決辦法,android貌似也沒有ios那種無縫的一個頁面切換的辦法。我這裡的解決辦法是在application裡存放一個靜態的mediaplayer

public static MediaPlayer mediaPlayer;//視頻播放靜態類
豎屏和橫屏是兩個activity,但是切換時只是對靜態mediaplayer執行pause,在獲取到當前播放位置傳遞給第二個activity,在執行start播放

3、在切換頁面時,直接給靜態的mediaplayer調用start方法時會報錯,或者從頭播放。原因有兩個,一、沒判斷surfaceview是否加載成功,重新進入activity也需要對surfaceview的准備狀態進行監聽,當執行surfaceCreated創建完成時才可繼續操作。二、沒有把surfaceview和mediaplayer重新綁定,必須執行setDisplay(surface.getHolder());後再去執行start才能正常播放!


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved