聊聊视频播放那些事2
Posted mamamia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聊聊视频播放那些事2相关的知识,希望对你有一定的参考价值。
MediaPlayer 工作逻辑了解一下
随便画了一下图帮助理解。
打个比喻,mediaplayer 可以为电影播放机。各种view是他的屏幕。回调事件可以理解为电影播放员。
继续聊无逢播放。
第一个页面在播的视频全屏以后或者跳第二页继续无逢播放。
直接的想法是,开始页面播了多少,进到第二页面接着上个播放点继续播。进入第二页后台,初始化mediaPlayer ,setResouce,setSurface ,start,seek到播放点。
会发现这个过程时间很长,转圈圈要好久,这并不是产品经理想要的。
要解决问题
以下内容了解一下。
第一:mediaPlayer应该单例工作。看mediaplayer源码,其中很多功能是natvie实现。他的工作是获取流并解码,形成图像流并展示在界面上。画图像流可以用surface Glsurface textrueView等 。
第二:mediaPlayer应该在线程工作。
第三:回调事件工作在UI线程。
试问以下问题。
MediaPlayer开始工作以后,"屏幕能不能换"?
MediaPlayer开始工作以后,"放影人能不能换"?
答案是可以的。
假设使用TextureView作为“银幕”,在场景1使用TextureView1 ,在场景2使用TextureView2,这个操作完全没有问题。
在MediaPlayer开始工作以后,重新设置各种 listener也是没有问题的。
那么:MediaPlayer播放不依赖于UI线路程,page1跳到page2 MediaPlayer播放不停,更换“银幕”和“放影人”就可以。
看效果,贴代码:
package com.example.administrator.videotest; import android.annotation.SuppressLint; import android.content.Intent; import android.graphics.SurfaceTexture; import android.media.MediaPlayer; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Surface; import android.view.TextureView; import android.view.View; import android.widget.Button; public class Main2Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); Button button = findViewById(R.id.bt); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(Main2Activity.this, Main3Activity.class); startActivity(i); } }); } @Override protected void onResume() { super.onResume(); StaticHolder.textureView = findViewById(R.id.tv); StaticHolder.textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { initMediaPlayer(new Surface(surface)); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { } }); } //声明成静态,第二页接着用。 static public MediaPlayer mediaPlayer; @SuppressLint("NewApi") public void initMediaPlayer(Surface surface) { try { mediaPlayer = MediaPlyerHelper.getMediaPlayer(); mediaPlayer.setSurface(surface); mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { } }); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mp.start(); } }); mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { return false; } }); //AssetFileDescriptor fileDescriptor = getAssets().openFd("sample.mp4"); mediaPlayer.setDataSource("https://mov.bn.netease.com/open-movie/nos/mp4/2016/01/11/SBC46Q9DV_hd.mp4"); mediaPlayer.prepare(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } }); } catch (Exception e) { e.printStackTrace(); } } }
package com.example.administrator.videotest; import android.graphics.SurfaceTexture; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Surface; import android.view.TextureView; public class Main3Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); TextureView rl = findViewById(R.id.tv); rl.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { Main2Activity.mediaPlayer.setSurface(new Surface(surface)); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { } }); } }
怎么样基本无逢跳转。
先到这儿下篇更多内容,制作《腾讯新闻》视频列表及相应动画。
以上是关于聊聊视频播放那些事2的主要内容,如果未能解决你的问题,请参考以下文章