Android_多媒体播放器们的简单使用

简介

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播放地址,可以直接使用官方提供的库。

  1. 根据可能运行的设备的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'
  1. 使用:
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的简单使用

  1. 导入ExoPlayer
implementation 'com.google.android.exoplayer:exoplayer:2.14.0'
  1. 使用:
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版权协议,转载请附上原文出处链接和本声明。