zoukankan      html  css  js  c++  java
  • Android ijkplayer详解使用教程

    1.认识ijkplayer

    最近公司准备开发一款视频播放及直播的应用,找了许多开源的框架,大部分都是基于ffmpeg开发的。最开始准备用Vitamio框架开发的,相关的文章也比较丰富,结果对于非个人移动应用均需购买Vitamio使用授权。不过B站开源的ijkplayer也不错,而且也不需要商业授权。 
    ijkplayer是一个基于FFmpeg的轻量级Android/iOS视频播放器。FFmpeg的是全球领先的多媒体框架,能够解码,编码, 转码,复用,解复用,流,过滤器和播放大部分的视频格式。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

    2.环境配置

    项目中引入ijkplayer环境有两种方式。

    2.1在Gradle中引入

    # required
    allprojects {
        repositories {
            jcenter()
        }
    }
    
    dependencies {
        # required, enough for most devices.
        compile 'tv.danmaku.ijk.media:ijkplayer-java:0.6.1'
        compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.6.1'
    
        # Other ABIs: optional
        compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.6.1'
        compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.6.1'
        compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.6.1'
        compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.6.1'
    
        # ExoPlayer as IMediaPlayer: optional, experimental
        compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.6.1'
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.2在Ubuntu下编译源码得到

    Ubuntu需要安装homebrew, Git, yasm

    # install homebrew, git, yasm
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    brew install git
    brew install yasm
    
    # add these lines to your ~/.bash_profile or ~/.profile
    # export ANDROID_SDK=<your sdk path>
    # export ANDROID_NDK=<your ndk path>
    
    # on Cygwin (unmaintained)
    # install git, make, yasm
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    开始编译

    git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
    cd ijkplayer-android
    git checkout -B latest k0.6.1
    
    ./init-android.sh
    
    cd android/contrib
    ./compile-ffmpeg.sh clean
    ./compile-ffmpeg.sh all
    
    cd ..
    ./compile-ijk.sh all
    
    # Android Studio:
    #     Open an existing Android Studio project
    #     Select android/ijkplayer/ and import
    #
    #     define ext block in your root build.gradle
    #     ext {
    #       compileSdkVersion = 23       // depending on your sdk version
    #       buildToolsVersion = "23.0.0" // depending on your build tools version
    #
    #       targetSdkVersion = 23        // depending on your sdk version
    #     }
    #
    # Eclipse: (obselete)
    #     File -> New -> Project -> Android Project from Existing Code
    #     Select android/ and import all project
    #     Import appcompat-v7
    #     Import preference-v7
    #
    # Gradle
    #     cd ijkplayer
    #     gradle
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    目录结构

    目录结构

    3.播放器使用

    可能是网络的问题,使用Gradle导入会花费很长时间,如果遇到超时,还得重头来一遍,太费时间了。后来我就直接在Ubuntu下编译后,在android Studio下导入该项目。我先介绍下Demo中利用ijkplayer播放视频的过程。

    3.1初始化播放器

    IjkMediaPlayer.loadLibrariesOnce(null);
    IjkMediaPlayer.native_profileBegin("libijkplayer.so");
    • 1
    • 2
    • 1
    • 2

    3.2初始化IjkVideoView

    //这里使用的是Demo中提供的AndroidMediaController类控制播放相关操作
    mMediaController = new AndroidMediaController(this, false);
    mMediaController.setSupportActionBar(actionBar);
    mVideoView = (IjkVideoView) findViewById(R.id.video_view);
    mVideoView.setMediaController(mMediaController);
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5

    3.3设置本地视频文件位置或服务器地址,然后播放

    mVideoView.setVideoPath(mVideoPath);
    mVideoView.start();
    • 1
    • 2
    • 1
    • 2

    3.4Activity销毁时,需要释放资源

    @Override
    public void onBackPressed() {
        mBackPressed = true;
        super.onBackPressed();
    }
    @Override
    protected void onStop() {
        super.onStop();
        //点击返回或不允许后台播放时 释放资源
        if (mBackPressed || !mVideoView.isBackgroundPlayEnabled()) {
            mVideoView.stopPlayback();
            mVideoView.release(true);
            mVideoView.stopBackgroundPlay();
        } else {
            mVideoView.enterBackground();
        }
        IjkMediaPlayer.native_profileEnd();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.自定义播放器

    当然官方提供的Demo只是演示视频播放的基本操作,对于视频播放的控制、全屏等操作,还要自己动手做。

    4.1部分声明

    private static final int SIZE_DEFAULT = 0;
    private static final int SIZE_4_3 = 1;
    private static final int SIZE_16_9 = 2;
    private int currentSize = SIZE_16_9;
    private IjkVideoView video;
    private SeekBar seekBar;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.2视频播放比例

    这里需要修改IjkVideoView部分代码后,才支持按比例播放

    //修改相关代码
    private static final int[] s_allAspectRatio = {
        IRenderView.AR_ASPECT_FIT_PARENT,
        IRenderView.AR_ASPECT_FILL_PARENT,
        IRenderView.AR_ASPECT_WRAP_CONTENT,
        IRenderView.AR_MATCH_PARENT,
        IRenderView.AR_16_9_FIT_PARENT,
        IRenderView.AR_4_3_FIT_PARENT
    };
    private int mCurrentAspectRatioIndex = 3;//0
    private int mCurrentAspectRatio = s_allAspectRatio[3];//0
    private int mCurrentRender = RENDER_TEXTURE_VIEW;
    //增加下面方法
    public IRenderView getmRenderView() {
        return mRenderView;
    }
    public int getmVideoWidth() {
       return mVideoWidth;
    }
    public int getmVideoHeight() {
       return mVideoHeight;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    设置视频播放比例

    public void setScreenRate(int rate) {
        int width = 0;
        int height = 0;
        if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {// 横屏
            if (rate == SIZE_DEFAULT) {
                width = video.getmVideoWidth();
                height = video.getmVideoHeight();
            } else if (rate == SIZE_4_3) {
                width = screenHeight / 3 * 4;
                height = screenHeight;
            } else if (rate == SIZE_16_9) {
                width = screenHeight / 9 * 16;
                height = screenHeight;
            }
        } else { //竖屏
            if (rate == SIZE_DEFAULT) {
                width = video.getmVideoWidth();
                height = video.getmVideoHeight();
            } else if (rate == SIZE_4_3) {
                width = screenWidth;
                height = screenWidth * 3 / 4;
            } else if (rate == SIZE_16_9) {
                width = screenWidth;
                height = screenWidth * 9 / 16;
            }
        }
        if (width > 0 && height > 0) {
            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) video.getmRenderView().getView().getLayoutParams();
            lp.width = width;
            lp.height = height;
            video.getmRenderView().getView().setLayoutParams(lp);
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    4.3屏幕方向切换

    private void fullChangeScreen() {
        if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {// 切换为竖屏
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.4全屏播放

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        //重新获取屏幕宽高
        initScreenInfo();
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//切换为横屏
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) video.getLayoutParams();
            lp.height = screenHeight;
            lp.width = screenWidth;
            video.setLayoutParams(lp);
        } else {
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) video.getLayoutParams();
            lp.height = screenWidth * 9 / 16;
            lp.width = screenWidth;
            video.setLayoutParams(lp);
        }
        setScreenRate(currentSize);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.5播放进度

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        ....
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
             video.seekTo(seekBar.getProgress()*video.getDuration()/100);
             ...
        }
    });
    //视频开始播放时使用handle.sendMessageDelayed更新时间显示
    private void refreshTime(){
        int totalSeconds = video.getCurrentPosition() / 1000;
        int seconds = totalSeconds % 60;
        int minutes = (totalSeconds / 60) % 60;
        int hours = totalSeconds / 3600;
        String ti=hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes, seconds):String.format("%02d:%02d", minutes, seconds);
        time.setText(ti);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    5.相关资料

    6.2017-03-31更新

    方便大家使用,提供编译好的各平台so文件,再引入“ijkplayer-Java”就可以直接使用。 
    http://download.csdn.net/detail/u010987039/9800324

    1.认识ijkplayer

    最近公司准备开发一款视频播放及直播的应用,找了许多开源的框架,大部分都是基于ffmpeg开发的。最开始准备用Vitamio框架开发的,相关的文章也比较丰富,结果对于非个人移动应用均需购买Vitamio使用授权。不过B站开源的ijkplayer也不错,而且也不需要商业授权。 
    ijkplayer是一个基于FFmpeg的轻量级Android/iOS视频播放器。FFmpeg的是全球领先的多媒体框架,能够解码,编码, 转码,复用,解复用,流,过滤器和播放大部分的视频格式。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

    2.环境配置

    项目中引入ijkplayer环境有两种方式。

    2.1在Gradle中引入

    # required
    allprojects {
        repositories {
            jcenter()
        }
    }
    
    dependencies {
        # required, enough for most devices.
        compile 'tv.danmaku.ijk.media:ijkplayer-java:0.6.1'
        compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.6.1'
    
        # Other ABIs: optional
        compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.6.1'
        compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.6.1'
        compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.6.1'
        compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.6.1'
    
        # ExoPlayer as IMediaPlayer: optional, experimental
        compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.6.1'
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.2在Ubuntu下编译源码得到

    Ubuntu需要安装homebrew, Git, yasm

    # install homebrew, git, yasm
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    brew install git
    brew install yasm
    
    # add these lines to your ~/.bash_profile or ~/.profile
    # export ANDROID_SDK=<your sdk path>
    # export ANDROID_NDK=<your ndk path>
    
    # on Cygwin (unmaintained)
    # install git, make, yasm
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    开始编译

    git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
    cd ijkplayer-android
    git checkout -B latest k0.6.1
    
    ./init-android.sh
    
    cd android/contrib
    ./compile-ffmpeg.sh clean
    ./compile-ffmpeg.sh all
    
    cd ..
    ./compile-ijk.sh all
    
    # Android Studio:
    #     Open an existing Android Studio project
    #     Select android/ijkplayer/ and import
    #
    #     define ext block in your root build.gradle
    #     ext {
    #       compileSdkVersion = 23       // depending on your sdk version
    #       buildToolsVersion = "23.0.0" // depending on your build tools version
    #
    #       targetSdkVersion = 23        // depending on your sdk version
    #     }
    #
    # Eclipse: (obselete)
    #     File -> New -> Project -> Android Project from Existing Code
    #     Select android/ and import all project
    #     Import appcompat-v7
    #     Import preference-v7
    #
    # Gradle
    #     cd ijkplayer
    #     gradle
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    目录结构

    目录结构

    3.播放器使用

    可能是网络的问题,使用Gradle导入会花费很长时间,如果遇到超时,还得重头来一遍,太费时间了。后来我就直接在Ubuntu下编译后,在android Studio下导入该项目。我先介绍下Demo中利用ijkplayer播放视频的过程。

    3.1初始化播放器

    IjkMediaPlayer.loadLibrariesOnce(null);
    IjkMediaPlayer.native_profileBegin("libijkplayer.so");
    • 1
    • 2
    • 1
    • 2

    3.2初始化IjkVideoView

    //这里使用的是Demo中提供的AndroidMediaController类控制播放相关操作
    mMediaController = new AndroidMediaController(this, false);
    mMediaController.setSupportActionBar(actionBar);
    mVideoView = (IjkVideoView) findViewById(R.id.video_view);
    mVideoView.setMediaController(mMediaController);
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5

    3.3设置本地视频文件位置或服务器地址,然后播放

    mVideoView.setVideoPath(mVideoPath);
    mVideoView.start();
    • 1
    • 2
    • 1
    • 2

    3.4Activity销毁时,需要释放资源

    @Override
    public void onBackPressed() {
        mBackPressed = true;
        super.onBackPressed();
    }
    @Override
    protected void onStop() {
        super.onStop();
        //点击返回或不允许后台播放时 释放资源
        if (mBackPressed || !mVideoView.isBackgroundPlayEnabled()) {
            mVideoView.stopPlayback();
            mVideoView.release(true);
            mVideoView.stopBackgroundPlay();
        } else {
            mVideoView.enterBackground();
        }
        IjkMediaPlayer.native_profileEnd();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.自定义播放器

    当然官方提供的Demo只是演示视频播放的基本操作,对于视频播放的控制、全屏等操作,还要自己动手做。

    4.1部分声明

    private static final int SIZE_DEFAULT = 0;
    private static final int SIZE_4_3 = 1;
    private static final int SIZE_16_9 = 2;
    private int currentSize = SIZE_16_9;
    private IjkVideoView video;
    private SeekBar seekBar;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.2视频播放比例

    这里需要修改IjkVideoView部分代码后,才支持按比例播放

    //修改相关代码
    private static final int[] s_allAspectRatio = {
        IRenderView.AR_ASPECT_FIT_PARENT,
        IRenderView.AR_ASPECT_FILL_PARENT,
        IRenderView.AR_ASPECT_WRAP_CONTENT,
        IRenderView.AR_MATCH_PARENT,
        IRenderView.AR_16_9_FIT_PARENT,
        IRenderView.AR_4_3_FIT_PARENT
    };
    private int mCurrentAspectRatioIndex = 3;//0
    private int mCurrentAspectRatio = s_allAspectRatio[3];//0
    private int mCurrentRender = RENDER_TEXTURE_VIEW;
    //增加下面方法
    public IRenderView getmRenderView() {
        return mRenderView;
    }
    public int getmVideoWidth() {
       return mVideoWidth;
    }
    public int getmVideoHeight() {
       return mVideoHeight;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    设置视频播放比例

    public void setScreenRate(int rate) {
        int width = 0;
        int height = 0;
        if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {// 横屏
            if (rate == SIZE_DEFAULT) {
                width = video.getmVideoWidth();
                height = video.getmVideoHeight();
            } else if (rate == SIZE_4_3) {
                width = screenHeight / 3 * 4;
                height = screenHeight;
            } else if (rate == SIZE_16_9) {
                width = screenHeight / 9 * 16;
                height = screenHeight;
            }
        } else { //竖屏
            if (rate == SIZE_DEFAULT) {
                width = video.getmVideoWidth();
                height = video.getmVideoHeight();
            } else if (rate == SIZE_4_3) {
                width = screenWidth;
                height = screenWidth * 3 / 4;
            } else if (rate == SIZE_16_9) {
                width = screenWidth;
                height = screenWidth * 9 / 16;
            }
        }
        if (width > 0 && height > 0) {
            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) video.getmRenderView().getView().getLayoutParams();
            lp.width = width;
            lp.height = height;
            video.getmRenderView().getView().setLayoutParams(lp);
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    4.3屏幕方向切换

    private void fullChangeScreen() {
        if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {// 切换为竖屏
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.4全屏播放

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        //重新获取屏幕宽高
        initScreenInfo();
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//切换为横屏
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) video.getLayoutParams();
            lp.height = screenHeight;
            lp.width = screenWidth;
            video.setLayoutParams(lp);
        } else {
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) video.getLayoutParams();
            lp.height = screenWidth * 9 / 16;
            lp.width = screenWidth;
            video.setLayoutParams(lp);
        }
        setScreenRate(currentSize);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.5播放进度

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        ....
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
             video.seekTo(seekBar.getProgress()*video.getDuration()/100);
             ...
        }
    });
    //视频开始播放时使用handle.sendMessageDelayed更新时间显示
    private void refreshTime(){
        int totalSeconds = video.getCurrentPosition() / 1000;
        int seconds = totalSeconds % 60;
        int minutes = (totalSeconds / 60) % 60;
        int hours = totalSeconds / 3600;
        String ti=hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes, seconds):String.format("%02d:%02d", minutes, seconds);
        time.setText(ti);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    5.相关资料

    6.2017-03-31更新

    方便大家使用,提供编译好的各平台so文件,再引入“ijkplayer-Java”就可以直接使用。 
    http://download.csdn.net/detail/u010987039/9800324

  • 相关阅读:
    SpringBoot整合ActiveMQ同时支持P2P和发布订阅模式(三)
    SpringBoot整合ActiveMQ的publish/subscribe发布订阅模式(二)
    Windows启动ActiveMQ报Wrapper Stopped错误
    IDEA从远程仓库克隆项目
    Git的安装
    IDEA上传项目到使用github上
    Mybaits的逆向工程
    posman测试接口需要登录验证的使用
    SSM整合SpringSecurity
    SpringBoot整合MongoDB的连接用户名和密码问题
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7211983.html
Copyright © 2011-2022 走看看