[关闭]
@cxm-2016 2016-09-19T11:37:36.000000Z 字数 1885 阅读 2772

Android:使用MediaPlayer和SurfaceView播放视频

android


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

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

Demo展示


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

  1. class SMActivity : BaseActivity<IPresenter>() {
  2. init {
  3. orientation = Orientation.LANDSCAPE
  4. }
  5. val mp = MediaPlayer()
  6. var isScroll = false
  7. val loop = ThreadUtils.Loop(500).loop {
  8. if (!isScroll)
  9. smSeekBar.progress = mp.currentPosition
  10. }
  11. override fun onCreate(savedInstanceState: Bundle?) {
  12. super.onCreate(savedInstanceState)
  13. setContentView(R.layout.activity_sm)
  14. smStart.setOnClickListener { start() }
  15. smPause.setOnClickListener { pause() }
  16. smStop.setOnClickListener { stop() }
  17. mp.setAudioStreamType(AudioManager.STREAM_MUSIC)
  18. mp.setDataSource(video)
  19. mp.prepare()
  20. smSeekBar.max = mp.duration
  21. smSeekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
  22. override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
  23. }
  24. override fun onStartTrackingTouch(seekBar: SeekBar?) {
  25. isScroll = true
  26. }
  27. override fun onStopTrackingTouch(seekBar: SeekBar) {
  28. mp.seekTo(seekBar.progress)
  29. isScroll = false
  30. }
  31. })
  32. smSurfaceView.holder.setKeepScreenOn(true)
  33. smSurfaceView.holder.addCallback(object : SurfaceHolder.Callback {
  34. override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
  35. }
  36. override fun surfaceDestroyed(holder: SurfaceHolder?) {
  37. }
  38. override fun surfaceCreated(holder: SurfaceHolder) {
  39. //********************************************
  40. mp.setDisplay(holder)//*******注意************
  41. //********************************************
  42. }
  43. })
  44. }
  45. fun start() {
  46. if (!mp.isPlaying) {
  47. mp.start()
  48. loop.start()
  49. }
  50. }
  51. fun pause() {
  52. if (mp.isPlaying) {
  53. mp.pause()
  54. }
  55. }
  56. fun stop() {
  57. mp.stop()
  58. loop.destroy()
  59. }
  60. override fun onDestroy() {
  61. if (mp.isPlaying) stop()
  62. mp.release()
  63. super.onDestroy()
  64. }
  65. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注