简介
Android中的媒体播放器有很多,其中主要使用的有三种,他们各自有自己的使用场景:
- MediaPlayer:是Android内置的媒体播放器,使用也是最简单的,不需要任何额外库导入,但是使用场景有限,一般不用于视频播放,多用于音频播放。
- IjkPlayer:是目前开源的最强大的播放器,基于FFmpeg,支持软硬编解码,如果是定制化需求的话需要自行编译出播放库。IjkPlayer多用于国内局点媒体类应用的开发。
- ExoPlayer:是google官方提供的一个Android应用级媒体播放器,他不仅仅支持Android原生的MediaPlayer所播放的媒体类型,还包括DASH、SmoothStreaming。与MediaPlayer不同的是,ExoPlayer可以很方便的扩展和自定义。由于Exoplayer依赖于Android中的MediaCodec API(Android 4.1 API 16),所以最低支持的版本是API不能小于16,Widewine公共秘钥是Android 4.4以上才能支持。ExoPlayer多用于国外局点媒体类应用的开发。
MediaPlayer的简单使用
MediaPlayer的使用最简单,不需要导入任何库,直接使用即可:
class SmartMediaPlayer(val surfaceHolder: SurfaceHolder): MediaPlayer.OnPreparedListener, SurfaceHolder.Callback {
val mPlayer = MediaPlayer().apply {
setOnPreparedListener(this@SmartMediaPlayer)
surfaceHolder.addCallback(this@SmartMediaPlayer)
}
fun start(url: String){
if (mPlayer.isPlaying){
mPlayer.stop()
}
mPlayer.reset()
mPlayer.setDataSource(url)
mPlayer.prepareAsync()
}
fun resume(){
mPlayer.start()
}
fun pause(){
mPlayer.pause()
}
fun stop(){
mPlayer.stop()
}
fun releasePlay(){
mPlayer.release()
}
fun getCurrentPosition() = mPlayer.currentPosition
override fun onPrepared(mp: MediaPlayer?) {
mPlayer.start()
}
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
}
override fun surfaceCreated(holder: SurfaceHolder) {
mPlayer.setSurface(holder.surface)
}
}
IjkPlayer的简单使用
IjkPlayer官方提供的默认库使用限制很大,不支持Https等格式播放,如果需要支持更多类型和协议需要自行编译。这边使用http播放地址,可以直接使用官方提供的库。
- 根据可能运行的设备的arm架构导入IJKPlayer:
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
- 使用:
package com.dean.playerdemo.player
import android.view.SurfaceHolder
import tv.danmaku.ijk.media.player.IMediaPlayer
import tv.danmaku.ijk.media.player.IjkMediaPlayer
import tv.danmaku.ijk.media.player.IjkMediaPlayer.native_setLogLevel
class SmartIjkPlayer(val surfaceHolder: SurfaceHolder) : SmartPlayer(), IMediaPlayer.OnPreparedListener{
val mPlayer = IjkMediaPlayer().apply {
setLogEnabled(true)
native_setLogLevel(IjkMediaPlayer.IJK_LOG_DEBUG)
//硬解
setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1)
setOnPreparedListener(this@SmartIjkPlayer)
}
override fun onPrepared(p0: IMediaPlayer?) {
mPlayer.start()
}
override fun start(url: String){
if (mPlayer.isPlaying){
mPlayer.stop()
}
mPlayer.reset()
mPlayer.setDataSource(url)
mPlayer.setSurface(surfaceHolder.surface)
mPlayer.prepareAsync()
}
override fun resume(){
mPlayer.start()
}
override fun pause(){
mPlayer.pause()
}
override fun stop(){
mPlayer.stop()
}
override fun releasePlay(){
mPlayer.release()
}
}
ExoPlayer的简单使用
- 导入ExoPlayer
implementation 'com.google.android.exoplayer:exoplayer:2.14.0'
- 使用:
class SmartExoPlayer(val surfaceHolder: SurfaceHolder) : SmartPlayer(), Player.Listener, SurfaceHolder.Callback {
val mPlayer = SimpleExoPlayer.Builder(BaseApp.instance).build().apply {
playWhenReady = true
surfaceHolder.addCallback(this@SmartExoPlayer)
}
override fun start(url: String){
mPlayer.addMediaItem(MediaItem.fromUri(url))
mPlayer.prepare()
}
override fun resume(){
mPlayer.prepare()
}
override fun pause(){
mPlayer.pause()
}
override fun stop(){
mPlayer.stop()
}
override fun releasePlay(){
mPlayer.release()
}
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
}
override fun surfaceCreated(holder: SurfaceHolder) {
mPlayer.setVideoSurface(surfaceHolder.surface)
}
}
版权声明:本文为qq_37658380原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。