parent
							
								
									365abafb9b
								
							
						
					
					
						commit
						aaabe133e8
					
				| @ -0,0 +1,94 @@ | ||||
| package com.frank.androidmedia.controller | ||||
| 
 | ||||
| import android.media.MediaPlayer | ||||
| import android.view.Surface | ||||
| import com.frank.androidmedia.listener.PlayerCallback | ||||
| import java.io.IOException | ||||
| 
 | ||||
| /** | ||||
|  * @author xufulong | ||||
|  * @date 3/18/22 1:53 PM | ||||
|  * @desc The controller of MediaPlayer | ||||
|  */ | ||||
| open class MediaPlayerController(playerCallback: PlayerCallback) { | ||||
| 
 | ||||
|     private var mediaPlayer: MediaPlayer? = null | ||||
|     private var renderFirstFrame: Boolean = false | ||||
|     private var playerCallback: PlayerCallback? = null | ||||
| 
 | ||||
|     init { | ||||
|         this.playerCallback = playerCallback | ||||
|     } | ||||
| 
 | ||||
|     fun initPlayer(filePath :String, surface :Surface) { | ||||
|         if (mediaPlayer != null) { | ||||
|             releasePlayer() | ||||
|         } | ||||
|         try { | ||||
|             renderFirstFrame = false | ||||
|             mediaPlayer = MediaPlayer() | ||||
|             mediaPlayer!!.setOnPreparedListener { | ||||
|                 mediaPlayer!!.start() | ||||
|                 playerCallback?.onPrepare() | ||||
|             } | ||||
|             mediaPlayer!!.setOnErrorListener { | ||||
|                 mp: MediaPlayer?, what: Int, extra: Int -> | ||||
|                 return@setOnErrorListener playerCallback?.onError(what, extra)!! | ||||
|             } | ||||
|             mediaPlayer!!.setOnCompletionListener { | ||||
|                 playerCallback?.onCompleteListener() | ||||
|             } | ||||
|             mediaPlayer!!.setOnInfoListener { | ||||
|                 mp, what, extra ->  ( | ||||
|                 if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) { | ||||
|                     if (!renderFirstFrame) { | ||||
|                         renderFirstFrame = true | ||||
|                         playerCallback?.onRenderFirstFrame() | ||||
|                     } | ||||
|                 }) | ||||
|                 return@setOnInfoListener true | ||||
|             } | ||||
|             mediaPlayer!!.setDataSource(filePath) | ||||
|             mediaPlayer!!.setSurface(surface) | ||||
|             mediaPlayer!!.prepareAsync() | ||||
|         } catch (e: IOException) { | ||||
|             e.printStackTrace() | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fun currentPosition() : Int { | ||||
|         if (mediaPlayer == null) | ||||
|             return 0 | ||||
|         return mediaPlayer!!.currentPosition | ||||
|     } | ||||
| 
 | ||||
|     fun duration() : Int { | ||||
|         if (mediaPlayer == null) | ||||
|             return 0 | ||||
|         return mediaPlayer!!.duration | ||||
|     } | ||||
| 
 | ||||
|     fun seekTo(position :Int) { | ||||
|         mediaPlayer?.seekTo(position) | ||||
|     } | ||||
| 
 | ||||
|     fun togglePlay() { | ||||
|         if (mediaPlayer == null) | ||||
|             return | ||||
| 
 | ||||
|         if (mediaPlayer!!.isPlaying) { | ||||
|             mediaPlayer!!.pause() | ||||
|         } else { | ||||
|             mediaPlayer!!.start() | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fun releasePlayer() { | ||||
|         if (mediaPlayer != null) { | ||||
|             mediaPlayer!!.stop() | ||||
|             mediaPlayer!!.release() | ||||
|             mediaPlayer = null | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,18 @@ | ||||
| package com.frank.androidmedia.listener | ||||
| 
 | ||||
| /** | ||||
|  * @author xufulong | ||||
|  * @date 3/18/22 2:25 PM | ||||
|  * @desc | ||||
|  */ | ||||
| interface PlayerCallback { | ||||
| 
 | ||||
|     fun onPrepare() | ||||
| 
 | ||||
|     fun onError(what :Int, extra :Int) :Boolean | ||||
| 
 | ||||
|     fun onRenderFirstFrame() | ||||
| 
 | ||||
|     fun onCompleteListener() | ||||
| 
 | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue