• 聊聊视频播放那些事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) {
    
                }
            });
        }
    }

    怎么样基本无逢跳转。

    先到这儿下篇更多内容,制作《腾讯新闻》视频列表及相应动画。

  • 相关阅读:
    【Nginx 快速入门】反向代理、负载均衡、动静分离
    【Redis】缓存穿透、缓存击穿、缓存雪崩(面试必备)
    【Redis】特殊数据类型
    【Redis】特殊数据类型
    【Redis】特殊数据类型
    typescript 技巧学习
    angular9的学习(十九)
    angular11源码探索二十六[Router整体路由配置]
    angular11源码探索二十五[Router路由事件]
    angular11源码探索二十四[路由检测变更策略]
  • 原文地址:https://www.cnblogs.com/mamamia/p/9480920.html
Copyright © 2020-2023  润新知