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 物件的方法及說明,可鏈式開發。