Android:使用MediaPlayer和SurfaceView播放视频

使用MediaPlayer和SurfaceView播放视频

标签(空格分隔): android


Android中提供的MediaPlayer播放器并没有提供视频输出界面,所以我们需要使用SurfaceView来当做图像的输出界面。
使用步骤如下:

  • 创建MediaPlayer对象,并加载视频文件
  • 为SurfaceView的SurfaceHolder添加监听器CallBack
  • 调用MediaPlayer对象的setDisplay(SurfaceHolder hd)将播放的视频图像输出到指定的SurfaceView(注意,此方法需要在SurfaceView被完全创建后调用,不然会抛出The surface has been released异常)

Demo展示


下列程序示例,这里千万注意setDisplay方法一定要在监听回调中调用,否则会由于SurfaceView并未完全创建而引发异常

class SMActivity : BaseActivity<IPresenter>() {
    init {
        orientation = Orientation.LANDSCAPE
    }

    val mp = MediaPlayer()
    var isScroll = false
    val loop = ThreadUtils.Loop(500).loop {
        if (!isScroll)
            smSeekBar.progress = mp.currentPosition
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sm)

        smStart.setOnClickListener { start() }
        smPause.setOnClickListener { pause() }
        smStop.setOnClickListener { stop() }


        mp.setAudioStreamType(AudioManager.STREAM_MUSIC)
        mp.setDataSource(video)
        mp.prepare()

        smSeekBar.max = mp.duration
        smSeekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
                isScroll = true
            }

            override fun onStopTrackingTouch(seekBar: SeekBar) {
                mp.seekTo(seekBar.progress)
                isScroll = false
            }
        })

        smSurfaceView.holder.setKeepScreenOn(true)
        smSurfaceView.holder.addCallback(object : SurfaceHolder.Callback {
            override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
            }

            override fun surfaceDestroyed(holder: SurfaceHolder?) {
            }

            override fun surfaceCreated(holder: SurfaceHolder) {
                //********************************************
                mp.setDisplay(holder)//*******注意************
                //********************************************
            }
        })
    }

    fun start() {
        if (!mp.isPlaying) {
            mp.start()
            loop.start()
        }
    }

    fun pause() {
        if (mp.isPlaying) {
            mp.pause()
        }
    }

    fun stop() {
        mp.stop()
        loop.destroy()
    }

    override fun onDestroy() {
        if (mp.isPlaying) stop()
        mp.release()
        super.onDestroy()
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值