1. 程式人生 > >android 基於ijkplayer專案進行的播放器

android 基於ijkplayer專案進行的播放器

Download

Download or grab via Maven:

<dependency>
  <groupId>com.dou361.ijkplayer</groupId>
  <artifactId>jjdxm-ijkplayer</artifactId>
  <version>x.x.x</version>
</dependency>

or Gradle:

compile 'com.dou361.ijkplayer:jjdxm-ijkplayer:x.x.x'

歷史版本:

compile 'com.dou361.ijkplayer:jjdxm-ijkplayer:1.0.6'
compile 'com.dou361.ijkplayer:jjdxm-ijkplayer:1.0.5'
compile 'com.dou361.ijkplayer:jjdxm-ijkplayer:1.0.4'
compile 'com.dou361.ijkplayer:jjdxm-ijkplayer:1.0.3'
compile 'com.dou361.ijkplayer:jjdxm-ijkplayer:1.0.2'
compile 'com.dou361.ijkplayer:jjdxm-ijkplayer:1.0.1'
compile 'com.dou361.ijkplayer:jjdxm-ijkplayer:1.0.0'

jjdxm-ijkplayer requires at minimum Java 9 or Android 2.3.

Proguard

根據你的混淆器配置和使用,您可能需要在你的 proguard 檔案內配置以下內容:

-keep com.dou361.ijkplayer.** {
*;
}

Get Started

step1:

依賴本專案類庫

該專案是基於 ijkplayer 專案進行的視訊 UI 的二次封裝,目前只是預設在:

compile 'com.dou361.ijkplayer:jjdxm-ijkplayer:1.0.5' 

中加入了以下依賴:

compile 'tv.danmaku.ijk.media:ijkplayer-java:0.6.0'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.6.0'

如果你的專案中已經有依賴了 v4 或者 v7 包並且使用的版本不一樣可能會造成衝突,可以類似下面的方式進行引入依賴

compile('com.dou361.ijkplayer:jjdxm-ijkplayer:1.0.5') {
    exclude group: 'com.android.support', module: 'appcompat-v7'
}

如果要支援多種 ABI 型別的機型,可以根據需要新增以下依賴:

# required, enough for most devices.
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.6.0'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.6.0'

# Other ABIs: optional
compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.6.0'
compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.6.0'  //最小版本 21
compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.6.0'
compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.6.0'  //最小版本 21

ijkplayer 打包不同的 ABI 後,應該是對 EXO 支援才把部分 ABI 的最小版本設定為 21,考慮到部分機型需要 64 的支援,然而專案最小版本又不行改到 21,當前在專案中加入 x86、x86_64、arm64 檔案,以下是提供最小版本為 9 的 compile 依賴出來

//對應 ijkplayer 的  compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.6.0'
compile 'com.dou361.ijkplayer-armv7a:jjdxm-ijkplayer-armv7a:1.0.0'  
//對應 ijkplayer 的  compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.6.0'
compile 'com.dou361.ijkplayer-armv5:jjdxm-ijkplayer-armv5:1.0.0' 
//對應 ijkplayer 的  compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.6.0'
compile 'com.dou361.ijkplayer-arm64:jjdxm-ijkplayer-arm64:1.0.0' 
//對應 ijkplayer 的  compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.6.0'
compile 'com.dou361.ijkplayer-x86:jjdxm-ijkplayer-x86:1.0.0' 
//對應 ijkplayer 的  compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.6.0'
compile 'com.dou361.ijkplayer-x86_64:jjdxm-ijkplayer-x86_64:1.0.0'

demo 中原來的 jniLibs 目錄下的檔案,已經移除,都是使用上面的依賴方式,如果網路環境差 compile 不下來,可以到專案的 release 目錄中去下載

step2:

多種解析度流切換的案例,例如播放器的標清、高清、超清、720P 等。

1.簡單的播放器實現

rootView = getLayoutInflater().from(this).inflate(R.layout.simple_player_view_player, null);
setContentView(rootView);
String url = "http://9890.vod.myqcloud.com/9890_9c1fa3e2aea011e59fc841df10c92278.f20.mp4";
player = new PlayerView(this,rootView)
        .setTitle("什麼")
        .setScaleType(PlayStateParams.fitparent)
        .hideMenu(true)
        .forbidTouch(false)
        .showThumbnail(new OnShowThumbnailListener() {
            @Override
            public void onShowThumbnail(ImageView ivThumbnail) {
                Glide.with(mContext)
                        .load("http://pic2.nipic.com/20090413/406638_125424003_2.jpg")
                        .placeholder(R.color.cl_default)
                        .error(R.color.cl_error)
                        .into(ivThumbnail);
            }
        })
        .setPlaySource(url)
        .startPlay();

2.多種不同的解析度流的播放器實現

在佈局中使用 simple_player_view_player.xml 佈局

<include
    layout="@layout/simple_player_view_player"
    android:layout_width="match_parent"
    android:layout_height="180dp"/>

程式碼中建立一個播放器物件

/**播放資源*/
ist<VideoijkBean> list = new ArrayList<VideoijkBean>();
String url1 = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4";
String url2 = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4";
VideoijkBean m1 = new VideoijkBean();
m1.setStream("標清");
m1.setUrl(url1);
VideoijkBean m2 = new VideoijkBean();
m2.setStream("高清");
m2.setUrl(url2);
list.add(m1);
list.add(m2);
/**播放器*/
rootView = getLayoutInflater().from(this).inflate(你的佈局, null);
setContentView(rootView);
player = new PlayerView(this,rootView)
            .setTitle("什麼")
            .setScaleType(PlayStateParams.fitparent)
            .hideMenu(true)
            .forbidTouch(false)
            .showThumbnail(new OnShowThumbnailListener() {
                @Override
                public void onShowThumbnail(ImageView ivThumbnail) {
                    /**載入前顯示的縮圖*/
                    Glide.with(mContext)
                            .load("http://pic2.nipic.com/20090413/406638_125424003_2.jpg")
                            .placeholder(R.color.cl_default)
                            .error(R.color.cl_error)
                            .into(ivThumbnail);
                }
            })
            .setPlaySource(list)
            .startPlay();

step3:

配置生命週期方法,為了讓播放器同步 Activity 生命週期,建議以下方法都去配置,註釋的程式碼,主要作用是播放時螢幕常亮和暫停其它媒體的播放。

 @Override
protected void onPause() {
    super.onPause();
    if (player != null) {
        player.onPause();
    }
    /**demo 的內容,恢復系統其它媒體的狀態*/
    //MediaUtils.muteAudioFocus(mContext, true);
}

@Override
protected void onResume() {
    super.onResume();
    if (player != null) {
        player.onResume();
    }
    /**demo 的內容,暫停系統其它媒體的狀態*/
    MediaUtils.muteAudioFocus(mContext, false);
    /**demo 的內容,啟用裝置常亮狀態*/
    //if (wakeLock != null) {
    //    wakeLock.acquire();
    //}
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (player != null) {
        player.onDestroy();
    }
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (player != null) {
        player.onConfigurationChanged(newConfig);
    }
}

@Override
public void onBackPressed() {
    if (player != null && player.onBackPressed()) {
        return;
    }
    super.onBackPressed();
    /**demo 的內容,恢復裝置亮度狀態*/
    //if (wakeLock != null) {
    //    wakeLock.release();
    //}
}

More Actions

1.視訊介面裁剪設定,可通過方法 setScaleType(int type)去設定

1. PlayStateParams.fitParent:可能會剪裁,保持原視訊的大小,顯示在中心,當原視訊的大小超過 view 的大小超過部分裁剪處理
2. PlayStateParams.fillParent:可能會剪裁,等比例放大視訊,直到填滿 View 為止,超過 View 的部分作裁剪處理
3. PlayStateParams.wrapcontent:將視訊的內容完整居中顯示,如果視訊大於 view,則按比例縮視訊直到完全顯示在 view 中
4. PlayStateParams.fitXY:不剪裁,非等比例拉伸畫面填滿整個 View
5. PlayStateParams.f16_9:不剪裁,非等比例拉伸畫面到 16:9,並完全顯示在 View 中
6. PlayStateParams.f4_3:不剪裁,非等比例拉伸畫面到 4:3,並完全顯示在 View 中

2.自定義視訊介面,可以複製以下佈局內容到自己的專案中,注意已有的 id 不能修改或刪除,可以增加 view,可以對以下佈局內容調整顯示位置或者自行隱藏

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:id="@+id/app_video_box"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    android:orientation="vertical">


    <com.dou361.ijkplayer.widget.IjkVideoView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <LinearLayout
        android:id="@+id/ll_bg"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/black"
        android:orientation="vertical">

        <!-- 封面顯示-->
        <ImageView
            android:id="@+id/iv_trumb"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            android:visibility="visible"/>
    </LinearLayout>

    <!--重新播放-->
    <LinearLayout
        android:id="@+id/app_video_replay"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#33000000"
        android:gravity="center"
        android:orientation="vertical"
        android:visibility="gone">
        <!-- 播放狀態-->
        <TextView
            android:id="@+id/app_video_status_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/small_problem"
            android:textColor="@android:color/white"
            android:textSize="14dp"/>

        <ImageView
            android:id="@+id/app_video_replay_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="8dp"
            android:src="@drawable/simple_player_circle_outline_white_36dp"/>
    </LinearLayout>
    <!-- 網路提示-->
    <LinearLayout
        android:id="@+id/app_video_netTie"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#33000000"
        android:gravity="center"
        android:orientation="vertical"
        android:visibility="gone">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:gravity="center"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:text="您正在使用行動網路播放視訊\n 可能產生較高流量費用"
            android:textColor="@android:color/white"/>

        <TextView
            android:id="@+id/app_video_netTie_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/simple_player_btn"
            android:gravity="center"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:text="繼續"
            android:textColor="@android:color/white"/>
    </LinearLayout>

    <!--載入中-->
    <LinearLayout
        android:id="@+id/app_video_loading"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical"
        android:visibility="gone">

        <ProgressBar
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:indeterminateBehavior="repeat"
            android:indeterminateOnly="true"/>
        <TextView
            android:id="@+id/app_video_speed"
            android:layout_width="wrap_content"
            android:layout_marginTop="4dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:visibility="gone"
            android:text="188Kb/s"
            android:textColor="@android:color/white"/>
    </LinearLayout>

    <!-- 中間觸控提示-->
    <include
        layout="@layout/simple_player_touch_gestures"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>

    <!-- 頂部欄-->
    <include layout="@layout/simple_player_topbar"/>
    <!-- 底部欄-->
    <include
        layout="@layout/simple_player_controlbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"/>

    <!--聲音亮度控制-->
    <LinearLayout
        android:id="@+id/simple_player_settings_container"
        android:layout_width="250dp"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:background="#80000000"
        android:gravity="center_vertical"
        android:orientation="vertical"
        android:visibility="visible">

        <LinearLayout
            android:id="@+id/simple_player_volume_controller_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:src="@drawable/qcloud_player_icon_audio_vol_mute"/>

            <SeekBar
                android:id="@+id/simple_player_volume_controller"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="150dp"
                android:layout_height="wrap_content"/>

            <ImageView
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:src="@drawable/qcloud_player_icon_audio_vol"/>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/simple_player_brightness_controller_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:padding="5dp"
                android:src="@drawable/qcloud_player_icon_brightness"/>

            <SeekBar
                android:id="@+id/simple_player_brightness_controller"
                style="?android:attr/progressBarStyleHorizontal"
                android:layout_width="150dp"
                android:layout_height="wrap_content"/>

            <ImageView
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:src="@drawable/qcloud_player_icon_brightness"/>
        </LinearLayout>

    </LinearLayout>


    <!--解析度選擇-->
    <LinearLayout
        android:id="@+id/simple_player_select_stream_container"
        android:layout_width="150dp"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:background="#80000000"
        android:gravity="center_vertical"
        android:visibility="gone">

        <ListView
            android:id="@+id/simple_player_select_streams_list"
            android:layout_width="150dp"
            android:layout_height="wrap_content"/>
    </LinearLayout>


    <ImageView
        android:id="@+id/play_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_marginTop="8dp"
        android:src="@drawable/simple_player_center_play"/>

</RelativeLayout>

3.播放器 PlayerView 物件的方法如下:

PlayerView(Activity activity)

//生命週期方法回撥
PlayerView onPause()
PlayerView onResume()
PlayerView onDestroy()
PlayerView onConfigurationChanged(final Configuration newConfig)
boolean onBackPressed()
//顯示縮圖
PlayerView showThumbnail(OnShowThumbnailListener onShowThumbnailListener)
//設定播放資訊監聽回撥
PlayerView setOnInfoListener(IMediaPlayer.OnInfoListener onInfoListener)
//設定播放器中的返回鍵監聽
PlayerView setPlayerBackListener(OnPlayerBackListener listener)
//設定控制面板顯示隱藏監聽
PlayerView setOnControlPanelVisibilityChangListenter(OnControlPanelVisibilityChangeListener listener)
//百分比顯示切換
PlayerView toggleAspectRatio()
//設定播放區域拉伸型別
PlayerView setScaleType(int showType)
//旋轉角度
PlayerView setPlayerRotation()
//旋轉指定角度
PlayerView setPlayerRotation(int rotation)
//設定播放地址包括視訊清晰度列表對應地址列表
PlayerView setPlaySource(List<VideoijkBean> list)
//設定播放地址單個視訊 VideoijkBean
PlayerView setPlaySource(VideoijkBean videoijkBean)
//設定播放地址單個視訊地址時帶流名稱
PlayerView setPlaySource(String stream, String url)
//設定播放地址單個視訊地址時
PlayerView setPlaySource(String url)
//自動播放
PlayerView autoPlay(String path)
//開始播放
PlayerView startPlay()
//設定視訊名稱
PlayerView setTitle(String title)
//選擇要播放的流
PlayerView switchStream(int index)
//暫停播放
PlayerView pausePlay()
//停止播放
PlayerView stopPlay()
//設定播放位置
PlayerView seekTo(int playtime)
//獲取當前播放位置
int getCurrentPosition()
//獲取視訊播放總時長
long getDuration()
//設定 2/3/4/5G 和 WiFi 網路型別提示 true 為進行 2/3/4/5G 網路型別提示 false 不進行網路型別提示
PlayerView setNetWorkTypeTie(boolean isGNetWork)
//是否僅僅為全屏
PlayerView setOnlyFullScreen(boolean isFull)
//設定是否禁止雙擊
PlayerView setForbidDoulbeUp(boolean flag)
//當前播放的是否是直播
boolean isLive()
//是否禁止觸控
PlayerView forbidTouch(boolean forbidTouch)
//隱藏所有狀態介面
PlayerView hideAllUI()
獲取頂部控制 barview
View getTopBarView()
//獲取底部控制 barview
View getBottonBarView()
//獲取旋轉 view
ImageView getRationView()
//獲取返回 view
ImageView getBackView()
//獲取選單 view
ImageView getMenuView()
//獲取全屏按鈕 view
ImageView getFullScreenView()
//獲取底部 bar 的播放 view
ImageView getBarPlayerView()
//獲取中間的播放 view
ImageView getPlayerView()
//隱藏返回鍵,true 隱藏,false 為顯示
PlayerView hideBack(boolean isHide)
//隱藏選單鍵,true 隱藏,false 為顯示
PlayerView hideMenu(boolean isHide)
//隱藏解析度按鈕,true 隱藏,false 為顯示
PlayerView hideSteam(boolean isHide)
//隱藏旋轉按鈕,true 隱藏,false 為顯示
PlayerView hideRotation(boolean isHide)
//隱藏全屏按鈕,true 隱藏,false 為顯示
PlayerView hideFullscreen(boolean isHide)
//隱藏中間播放按鈕,ture 為隱藏,false 為不做隱藏處理,但不是顯示
PlayerView hideCenterPlayer(boolean isHide)
//顯示或隱藏操作面板
PlayerView operatorPanl()
//全屏切換
PlayerView toggleFullScreen()
//設定自動重連的模式或者重連時間,isAuto true 出錯重連,false 出錯不重連,connectTime 重連的時間
setAutoReConnect(boolean isAuto, int connectTime)
//進度條和時長顯示的方向切換
PlayerView toggleProcessDurationOrientation()
//設定進度條和時長顯示的方向,預設為上下顯示,PlayStateParams.PROCESS_PORTRAIT 為上下顯示 PlayStateParams.PROCESS_LANDSCAPE 為左右顯示 PlayStateParams.PROCESS_CENTER 為中間兩邊樣式
setProcessDurationOrientation(int portrait)
//顯示選單設定
showMenu()
//獲取介面方向
int getScreenOrientation()
//顯示載入網速
PlayerView setShowSpeed(boolean isShow)
//是否隱藏 topbar,true 為隱藏,false 為不隱藏,但不一定是顯示
PlayerView hideHideTopBar(boolean isHide)
//是否隱藏 bottonbar,true 為隱藏,false 為不隱藏,但不一定是顯示
PlayerView hideBottonBar(boolean isHide)
//是否隱藏上下 bar,true 為隱藏,false 為不隱藏,但不一定是顯示
PlayerView hideControlPanl(boolean isHide)
//設定是否禁止隱藏 bar,優先順序低於 hideControlPanl
PlayerView setForbidHideControlPanl(boolean flag)

4.全屏隱藏虛擬按鍵方法

參考 HPlayerActivity 類,獲取 Activity 的根目錄

main = getLayoutInflater().from(this).inflate(R.layout.activity_h, null);

然在在 oncreate()方法中設定監聽

    /**虛擬按鍵的隱藏方法*/
    main.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {

            //比較 Activity 根佈局與當前佈局的大小
            int heightDiff = main.getRootView().getHeight() - main.getHeight();
            if (heightDiff > 100) {
                //大小超過 100 時,一般為顯示虛擬鍵盤事件
                main.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
            } else {
                //大小小於 100 時,為不顯示虛擬鍵盤或虛擬鍵盤隱藏
                main.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

            }
        }
    });

5.半屏視訊,橫豎屏切換時不填滿問題

1.確保 Activity 中呼叫生命週期方法

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (player != null) {
        player.onConfigurationChanged(newConfig);
    }
}

2.確保清單檔案中配置屬性

android:configChanges="orientation|keyboardHidden|screenSize"
        android:screenOrientation="portrait"

例如

<activity
        android:name="com.dou361.jjdxm_ijkplayer.HPlayerActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme"/>

關於定製

隱藏部分不想要的介面

//隱藏返回鍵,true 隱藏,false 為顯示
PlayerView hideBack(boolean isHide)
//隱藏選單鍵,true 隱藏,false 為顯示
PlayerView hideMenu(boolean isHide)
//隱藏解析度按鈕,true 隱藏,false 為顯示
PlayerView hideSteam(boolean isHide)
//隱藏旋轉按鈕,true 隱藏,false 為顯示
PlayerView hideRotation(boolean isHide)
//隱藏全屏按鈕,true 隱藏,false 為顯示
PlayerView hideFullscreen(boolean isHide)
//隱藏中間播放按鈕,ture 為隱藏,false 為不做隱藏處理,但不是顯示
PlayerView hideCenterPlayer(boolean isHide)

載入時顯示網速

預設載入時不顯示網速,可以通過 setShowSpeed(boolean isShow)設定載入時是否需要顯示,true 為顯示,false 為不顯示

播放器底部 bar 播放進度條樣式定製

預設的進度樣式是豎屏為上下樣式,即進度條在播放時長的上面,橫屏為左右樣式,即進度條在播放時長的中間。樣式定製主要是兩個方法搭配使用 toggleProcessDurationOrientation 方法和 setProcessDurationOrientation 方法,橫豎屏切換 2 中情況,和 3 種進度條樣式

/**上下樣式*/
PlayStateParams.PROCESS_PORTRAIT
/**左右樣式*/
PlayStateParams.PROCESS_LANDSCAPE
/**中間兩邊樣式*/
PlayStateParams.PROCESS_CENTER

總共有 2 的 3 次方中樣式,下面只羅列幾種樣式

1.橫豎屏都為上下樣式

rootView = getLayoutInflater().from(this).inflate(你的佈局, null);
setContentView(rootView);
player = new PlayerView(this,rootView) {
        @Override
        public PlayerView toggleProcessDurationOrientation() {
            return setProcessDurationOrientation(PlayStateParams.PROCESS_PORTRAIT);
        }
    }
            .setTitle("什麼")
            .setProcessDurationOrientation(PlayStateParams.PROCESS_PORTRAIT)
            .setScaleType(PlayStateParams.fitparent)
            .forbidTouch(false)
            .hideCenterPlayer(true)
            .setPlaySource(list)
            .startPlay();

2.橫豎屏都為左右樣式

rootView = getLayoutInflater().from(this).inflate(你的佈局, null);
setContentView(rootView);
player = new PlayerView(this,rootView) {
        @Override
        public PlayerView toggleProcessDurationOrientation() {
            return setProcessDurationOrientation(PlayStateParams.PROCESS_LANDSCAPE);
        }
    }
            .setTitle("什麼")
            .setProcessDurationOrientation(PlayStateParams.PROCESS_LANDSCAPE)
            .setScaleType(PlayStateParams.fitparent)
            .forbidTouch(false)
            .hideCenterPlayer(true)
            .setPlaySource(list)
            .startPlay();

3.橫屏為上下樣式豎屏為左右樣式

rootView = getLayoutInflater().from(this).inflate(你的佈局, null);
setContentView(rootView);
player = new PlayerView(this,rootView) {
        @Override
        public PlayerView toggleProcessDurationOrientation() {
            return setProcessDurationOrientation(getScreenOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE?PlayStateParams.PROCESS_LANDSCAPE:PlayStateParams.PROCESS_PORTRAIT);
        }
    }
            .setTitle("什麼")
            .setProcessDurationOrientation(PlayStateParams.PROCESS_LANDSCAPE)
            .setScaleType(PlayStateParams.fitparent)
            .forbidTouch(false)
            .hideCenterPlayer(true)
            .setPlaySource(list)
            .startPlay();

4.橫屏為左右樣式豎屏為上下樣式

rootView = getLayoutInflater().from(this).inflate(你的佈局, null);
setContentView(rootView);
player = new PlayerView(this,rootView) {
        @Override
        public PlayerView toggleProcessDurationOrientation() {
            return setProcessDurationOrientation(getScreenOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT?PlayStateParams.PROCESS_PORTRAIT:PlayStateParams.PROCESS_LANDSCAPE);
        }
    }
            .setTitle("什麼")
            .setProcessDurationOrientation(PlayStateParams.PROCESS_CENTER)
            .setScaleType(PlayStateParams.fitparent)
            .forbidTouch(false)
            .hideCenterPlayer(true)
            .setPlaySource(list)
            .startPlay();

5.橫屏為左右樣式豎屏為中間兩邊樣式

rootView = getLayoutInflater().from(this).inflate(你的佈局, null);
setContentView(rootView);
player = new PlayerView(this,rootView) {
        @Override
        public PlayerView toggleProcessDurationOrientation() {
            return setProcessDurationOrientation(getScreenOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT?PlayStateParams.PROCESS_CENTER:PlayStateParams.PROCESS_LANDSCAPE);
        }
    }
            .setTitle("什麼")
            .setProcessDurationOrientation(PlayStateParams.PROCESS_CENTER)
            .setScaleType(PlayStateParams.fitparent)
            .forbidTouch(false)
            .hideCenterPlayer(true)
            .setPlaySource(list)
            .startPlay();

3.ijkplayer 封裝的視訊播放資訊返回碼監聽,可以通過 setOnInfoListener 去監聽

/*
 * Do not change these values without updating their counterparts in native
 */
int MEDIA_INFO_UNKNOWN = 1;//未知資訊
int MEDIA_INFO_STARTED_AS_NEXT = 2;//播放下一條
int MEDIA_INFO_VIDEO_RENDERING_START = 3;//視訊開始整備中
int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700;//視訊日誌跟蹤
int MEDIA_INFO_BUFFERING_START = 701;//開始緩衝中
int MEDIA_INFO_BUFFERING_END = 702;//緩衝結束
int MEDIA_INFO_NETWORK_BANDWIDTH = 703;//網路頻寬,網速方面
int MEDIA_INFO_BAD_INTERLEAVING = 800;//
int MEDIA_INFO_NOT_SEEKABLE = 801;//不可設定播放位置,直播方面
int MEDIA_INFO_METADATA_UPDATE = 802;//
int MEDIA_INFO_TIMED_TEXT_ERROR = 900;
int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901;//不支援字幕
int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902;//字幕超時

int MEDIA_INFO_VIDEO_INTERRUPT= -10000;//資料連線中斷
int MEDIA_INFO_VIDEO_ROTATION_CHANGED = 10001;//視訊方向改變
int MEDIA_INFO_AUDIO_RENDERING_START = 10002;//音訊開始整備中

int MEDIA_ERROR_UNKNOWN = 1;//未知錯誤
int MEDIA_ERROR_SERVER_DIED = 100;//服務掛掉
int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;//資料錯誤沒有有效的回收
int MEDIA_ERROR_IO = -1004;//IO 錯誤
int MEDIA_ERROR_MALFORMED = -1007;
int MEDIA_ERROR_UNSUPPORTED = -1010;//資料不支援
int MEDIA_ERROR_TIMED_OUT = -110;//資料超時

ChangeLog

2016.09.05 修改支援非 Activity 中使用當前播放器 view,例如 fragment、holder 之類使用,新增直播地址獲取,提供可觀看案例(如直播地址有不妥的地方可聯絡刪除,多有得罪啦) 遺留問題: 觸控時,隱藏動作取消 觸控時,進度條面會有點共用 直播停止開始卡幀 手動換源卡幀 直播判斷問題 進度條隱藏提取方法出來 修改初始化方法 本地視訊播放問題 播放載入狀態的監聽問題比如說連結失效,請求超時,斷流了,斷網了之類的 緩衝好內容使用 seekto 之後還是需要重新緩衝 樂視手機 點開亮度為 0

2016.08.30 修復播放時長為零問題;修復使用拉伸方法橫屏方向不起效問題;修改最小支援版本為 9;添加了 SO 檔案的最小版本為 9 的類庫;新增 VideoijkBean 比較方法,可以比對視訊物件是不是同一個;新增橫豎屏配置說明;新增隱藏虛擬按鍵的方法。

2016.08.26 1.0.5 新增上下操作工具欄的隱藏定製,主要是 hideControlPanl,hideHideTopBar 和 hideBottonBar 方法控制

2016.08.26 1.0.4 打包修復播放進度樣式點選返回鍵不起效

2016.08.25 1.0.3 新增視訊播放進度條樣式,新增選單設定

2016.08.24 1.0.2 修復播放出錯點選沒有反應,這是修改旋轉視訊方向是造成的 bug,當前預設為 5 秒無操作自動重試,修改載入進度條的顯示時間,之前是載入回撥整備中才顯示,改為點選載入立即顯示,新增修改自動重試的方式和重試的時間

2016.08.20 修復視訊進入後臺繼續播放,切換視訊源是畫面卡住等問題

2016.08.20 1.0.1 修復點選播放、點選暫停、再點選播放時,載入進度條一直顯示問題;修復第一次開啟播放器,觸控視訊介面,視訊重新播放問題;恢復視訊拖動條預設樣式,修復顯示不完整問題;新增對外操作的 view,可通過 getxxxView()方法獲得;添加了 PlayerView 物件的方法及說明,可鏈式開發。

QQ:316988670

交流 QQ 群:548545202