Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
NotesChapter
GSYVideoPlayer
提交
0e4651df
G
GSYVideoPlayer
项目概览
NotesChapter
/
GSYVideoPlayer
与 Fork 源项目一致
从无法访问的项目Fork
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
GSYVideoPlayer
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0e4651df
编写于
2月 17, 2020
作者:
G
guoshuyu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
##2550 调整初始化 index 设置不对问题
上级
a21600bd
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
101 addition
and
43 deletion
+101
-43
app/src/main/java/com/example/gsyvideoplayer/exo/DetailExoListPlayer.java
...a/com/example/gsyvideoplayer/exo/DetailExoListPlayer.java
+1
-0
app/src/main/java/com/example/gsyvideoplayer/exo/GSYExo2MediaPlayer.java
...va/com/example/gsyvideoplayer/exo/GSYExo2MediaPlayer.java
+58
-3
app/src/main/java/com/example/gsyvideoplayer/exo/GSYExo2PlayerView.java
...ava/com/example/gsyvideoplayer/exo/GSYExo2PlayerView.java
+34
-34
app/src/main/java/com/example/gsyvideoplayer/exo/GSYExoModel.java
...main/java/com/example/gsyvideoplayer/exo/GSYExoModel.java
+3
-1
app/src/main/java/com/example/gsyvideoplayer/exo/GSYExoPlayerManager.java
...a/com/example/gsyvideoplayer/exo/GSYExoPlayerManager.java
+3
-3
app/src/main/java/com/example/gsyvideoplayer/exo/GSYExoVideoManager.java
...va/com/example/gsyvideoplayer/exo/GSYExoVideoManager.java
+2
-2
未找到文件。
app/src/main/java/com/example/gsyvideoplayer/exo/DetailExoListPlayer.java
浏览文件 @
0e4651df
...
...
@@ -48,6 +48,7 @@ public class DetailExoListPlayer extends GSYBaseActivityDetail<GSYExo2PlayerView
urls
.
add
(
new
GSYVideoModel
(
"http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4"
,
"标题1"
));
urls
.
add
(
new
GSYVideoModel
(
"https://media6.smartstudy.com/ae/07/3997/2/dest.m3u8"
,
"标题3"
));
urls
.
add
(
new
GSYVideoModel
(
"http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4"
,
"标题2"
));
//detailPlayer.setUp(urls, 1);
detailPlayer
.
setUp
(
urls
,
0
);
//使用 exo 的 CacheDataSourceFactory 实现
...
...
app/src/main/java/com/example/gsyvideoplayer/exo/GSYExo2MediaPlayer.java
浏览文件 @
0e4651df
...
...
@@ -2,11 +2,17 @@ package com.example.gsyvideoplayer.exo;
import
android.content.Context
;
import
android.net.Uri
;
import
android.os.Handler
;
import
android.os.Looper
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.DefaultLoadControl
;
import
com.google.android.exoplayer2.DefaultRenderersFactory
;
import
com.google.android.exoplayer2.ExoPlayerFactory
;
import
com.google.android.exoplayer2.Timeline
;
import
com.google.android.exoplayer2.source.ConcatenatingMediaSource
;
import
com.google.android.exoplayer2.source.MediaSource
;
import
com.google.android.exoplayer2.trackselection.DefaultTrackSelector
;
import
com.shuyu.gsyvideoplayer.utils.Debuger
;
import
java.io.FileDescriptor
;
...
...
@@ -14,6 +20,7 @@ import java.util.List;
import
java.util.Map
;
import
tv.danmaku.ijk.media.exo2.IjkExo2MediaPlayer
;
import
tv.danmaku.ijk.media.exo2.demo.EventLogger
;
import
tv.danmaku.ijk.media.player.IMediaPlayer
;
/**
...
...
@@ -29,6 +36,8 @@ public class GSYExo2MediaPlayer extends IjkExo2MediaPlayer {
public
static
final
int
POSITION_DISCONTINUITY
=
899
;
private
int
playIndex
=
0
;
public
GSYExo2MediaPlayer
(
Context
context
)
{
super
(
context
);
}
...
...
@@ -63,19 +72,22 @@ public class GSYExo2MediaPlayer extends IjkExo2MediaPlayer {
notifyOnInfo
(
POSITION_DISCONTINUITY
,
reason
);
}
public
void
setDataSource
(
List
<
String
>
uris
,
Map
<
String
,
String
>
headers
,
boolean
cache
)
{
public
void
setDataSource
(
List
<
String
>
uris
,
Map
<
String
,
String
>
headers
,
int
index
,
boolean
cache
)
{
mHeaders
=
headers
;
if
(
uris
==
null
)
{
return
;
}
ConcatenatingMediaSource
concatenatedSource
=
new
ConcatenatingMediaSource
();
for
(
String
uri
:
uris
)
{
MediaSource
mediaSource
=
mExoHelper
.
getMediaSource
(
uri
,
isPreview
,
cache
,
false
,
mCacheDir
,
getOverrideExtension
());
MediaSource
mediaSource
=
mExoHelper
.
getMediaSource
(
uri
,
isPreview
,
cache
,
false
,
mCacheDir
,
getOverrideExtension
());
concatenatedSource
.
addMediaSource
(
mediaSource
);
}
playIndex
=
index
;
mMediaSource
=
concatenatedSource
;
}
/**
* 上一集
*/
...
...
@@ -99,6 +111,49 @@ public class GSYExo2MediaPlayer extends IjkExo2MediaPlayer {
}
}
@Override
protected
void
prepareAsyncInternal
()
{
new
Handler
(
Looper
.
getMainLooper
()).
post
(
new
Runnable
()
{
@Override
public
void
run
()
{
if
(
mTrackSelector
==
null
)
{
mTrackSelector
=
new
DefaultTrackSelector
();
}
mEventLogger
=
new
EventLogger
(
mTrackSelector
);
boolean
preferExtensionDecoders
=
true
;
boolean
useExtensionRenderers
=
true
;
//是否开启扩展
@DefaultRenderersFactory
.
ExtensionRendererMode
int
extensionRendererMode
=
useExtensionRenderers
?
(
preferExtensionDecoders
?
DefaultRenderersFactory
.
EXTENSION_RENDERER_MODE_PREFER
:
DefaultRenderersFactory
.
EXTENSION_RENDERER_MODE_ON
)
:
DefaultRenderersFactory
.
EXTENSION_RENDERER_MODE_OFF
;
if
(
mRendererFactory
==
null
)
{
mRendererFactory
=
new
DefaultRenderersFactory
(
mAppContext
);
mRendererFactory
.
setExtensionRendererMode
(
extensionRendererMode
);
}
if
(
mLoadControl
==
null
)
{
mLoadControl
=
new
DefaultLoadControl
();
}
mInternalPlayer
=
ExoPlayerFactory
.
newSimpleInstance
(
mAppContext
,
mRendererFactory
,
mTrackSelector
,
mLoadControl
,
null
,
Looper
.
getMainLooper
());
mInternalPlayer
.
addListener
(
GSYExo2MediaPlayer
.
this
);
mInternalPlayer
.
addAnalyticsListener
(
GSYExo2MediaPlayer
.
this
);
mInternalPlayer
.
addListener
(
mEventLogger
);
if
(
mSpeedPlaybackParameters
!=
null
)
{
mInternalPlayer
.
setPlaybackParameters
(
mSpeedPlaybackParameters
);
}
if
(
mSurface
!=
null
)
mInternalPlayer
.
setVideoSurface
(
mSurface
);
///fix start index
if
(
playIndex
>
0
)
{
mInternalPlayer
.
seekTo
(
playIndex
,
C
.
INDEX_UNSET
);
}
mInternalPlayer
.
prepare
(
mMediaSource
,
false
,
false
);
mInternalPlayer
.
setPlayWhenReady
(
false
);
}
}
);
}
/**
* 下一集
*/
...
...
@@ -123,6 +178,6 @@ public class GSYExo2MediaPlayer extends IjkExo2MediaPlayer {
if
(
mInternalPlayer
==
null
)
{
return
0
;
}
return
mInternalPlayer
.
getCurrentWindowIndex
();
return
mInternalPlayer
.
getCurrentWindowIndex
();
}
}
app/src/main/java/com/example/gsyvideoplayer/exo/GSYExo2PlayerView.java
浏览文件 @
0e4651df
...
...
@@ -30,10 +30,10 @@ import static com.example.gsyvideoplayer.exo.GSYExo2MediaPlayer.POSITION_DISCONT
/**
Created by guoshuyu on 2018/5/16.
自定义View支持exo的list数据,实现无缝切换效果
这是一种思路,通过自定义后GSYExo2MediaPlayer内部,通过ConcatenatingMediaSource实现列表播放
诸如此类,还可以实现AdsMediaSource等
*
Created by guoshuyu on 2018/5/16.
*
自定义View支持exo的list数据,实现无缝切换效果
*
这是一种思路,通过自定义后GSYExo2MediaPlayer内部,通过ConcatenatingMediaSource实现列表播放
*
诸如此类,还可以实现AdsMediaSource等
*/
public
class
GSYExo2PlayerView
extends
StandardGSYVideoPlayer
{
...
...
@@ -43,7 +43,7 @@ public class GSYExo2PlayerView extends StandardGSYVideoPlayer {
protected
boolean
mExoCache
=
false
;
/**
1.5.0开始加入,如果需要不同布局区分功能,需要重载
*
1.5.0开始加入,如果需要不同布局区分功能,需要重载
*/
public
GSYExo2PlayerView
(
Context
context
,
Boolean
fullFlag
)
{
super
(
context
,
fullFlag
);
...
...
@@ -59,50 +59,50 @@ public class GSYExo2PlayerView extends StandardGSYVideoPlayer {
/**
设置播放URL
@param url 播放url
@param position 需要播放的位置
@return
*
设置播放URL
*
*
@param url 播放url
*
@param position 需要播放的位置
*
@return
*/
public
boolean
setUp
(
List
<
GSYVideoModel
>
url
,
int
position
)
{
return
setUp
(
url
,
position
,
null
,
new
HashMap
<
String
,
String
>());
}
/**
设置播放URL
@param url 播放url
@param position 需要播放的位置
@param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
@return
*
设置播放URL
*
*
@param url 播放url
*
@param position 需要播放的位置
*
@param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
*
@return
*/
public
boolean
setUp
(
List
<
GSYVideoModel
>
url
,
int
position
,
File
cachePath
)
{
return
setUp
(
url
,
position
,
cachePath
,
new
HashMap
<
String
,
String
>());
}
/**
设置播放URL
@param url 播放url
@param position 需要播放的位置
@param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
@param mapHeadData http header
@return
*
设置播放URL
*
*
@param url 播放url
*
@param position 需要播放的位置
*
@param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
*
@param mapHeadData http header
*
@return
*/
public
boolean
setUp
(
List
<
GSYVideoModel
>
url
,
int
position
,
File
cachePath
,
Map
<
String
,
String
>
mapHeadData
)
{
return
setUp
(
url
,
position
,
cachePath
,
mapHeadData
,
true
);
}
/**
设置播放URL
@param url 播放url
@param position 需要播放的位置
@param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
@param mapHeadData http header
@param changeState 切换的时候释放surface
@return
*
设置播放URL
*
*
@param url 播放url
*
@param position 需要播放的位置
*
@param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false
*
@param mapHeadData http header
*
@param changeState 切换的时候释放surface
*
@return
*/
protected
boolean
setUp
(
List
<
GSYVideoModel
>
url
,
int
position
,
File
cachePath
,
Map
<
String
,
String
>
mapHeadData
,
boolean
changeState
)
{
mUriList
=
url
;
...
...
@@ -184,14 +184,14 @@ public class GSYExo2PlayerView extends StandardGSYVideoPlayer {
Debuger
.
printfError
(
"********************** urls isEmpty . Do you know why ? **********************"
);
}
((
GSYExoVideoManager
)
getGSYVideoManager
()).
prepare
(
urls
,
(
mMapHeadData
==
null
)
?
new
HashMap
<
String
,
String
>()
:
mMapHeadData
,
mLooping
,
mSpeed
,
mExoCache
,
mCachePath
,
mOverrideExtension
);
((
GSYExoVideoManager
)
getGSYVideoManager
()).
prepare
(
urls
,
(
mMapHeadData
==
null
)
?
new
HashMap
<
String
,
String
>()
:
mMapHeadData
,
m
PlayPosition
,
m
Looping
,
mSpeed
,
mExoCache
,
mCachePath
,
mOverrideExtension
);
setStateAndUi
(
CURRENT_STATE_PREPAREING
);
}
/**
显示wifi确定框,如需要自定义继承重写即可
*
显示wifi确定框,如需要自定义继承重写即可
*/
@Override
protected
void
showWifiDialog
()
{
...
...
@@ -252,7 +252,7 @@ public class GSYExo2PlayerView extends StandardGSYVideoPlayer {
@Override
public
void
onInfo
(
int
what
,
int
extra
)
{
if
(
what
==
POSITION_DISCONTINUITY
)
{
int
window
=
((
GSYExo2MediaPlayer
)
getGSYVideoManager
().
getPlayer
().
getMediaPlayer
()).
getCurrentWindowIndex
();
int
window
=
((
GSYExo2MediaPlayer
)
getGSYVideoManager
().
getPlayer
().
getMediaPlayer
()).
getCurrentWindowIndex
();
mPlayPosition
=
window
;
GSYVideoModel
gsyVideoModel
=
mUriList
.
get
(
window
);
if
(!
TextUtils
.
isEmpty
(
gsyVideoModel
.
getTitle
()))
{
...
...
app/src/main/java/com/example/gsyvideoplayer/exo/GSYExoModel.java
浏览文件 @
0e4651df
...
...
@@ -15,10 +15,12 @@ import java.util.Map;
public
class
GSYExoModel
extends
GSYModel
{
List
<
String
>
urls
=
new
ArrayList
<>();
int
index
=
0
;
public
GSYExoModel
(
List
<
String
>
urls
,
Map
<
String
,
String
>
mapHeadData
,
boolean
loop
,
float
speed
,
boolean
cache
,
File
cachePath
,
String
overrideExtension
)
{
public
GSYExoModel
(
List
<
String
>
urls
,
Map
<
String
,
String
>
mapHeadData
,
int
index
,
boolean
loop
,
float
speed
,
boolean
cache
,
File
cachePath
,
String
overrideExtension
)
{
super
(
""
,
mapHeadData
,
loop
,
speed
,
cache
,
cachePath
,
overrideExtension
);
this
.
urls
=
urls
;
this
.
index
=
index
;
}
public
List
<
String
>
getUrls
()
{
...
...
app/src/main/java/com/example/gsyvideoplayer/exo/GSYExoPlayerManager.java
浏览文件 @
0e4651df
...
...
@@ -43,7 +43,7 @@ public class GSYExoPlayerManager extends BasePlayerManager {
mediaPlayer
.
setLooping
(((
GSYExoModel
)
msg
.
obj
).
isLooping
());
Debuger
.
printfError
(
"###### "
+
((
GSYExoModel
)
msg
.
obj
).
getOverrideExtension
());
mediaPlayer
.
setOverrideExtension
(((
GSYExoModel
)
msg
.
obj
).
getOverrideExtension
());
mediaPlayer
.
setDataSource
(((
GSYExoModel
)
msg
.
obj
).
getUrls
(),
((
GSYExoModel
)
msg
.
obj
).
getMapHeadData
(),
((
GSYExoModel
)
msg
.
obj
).
isCache
());
mediaPlayer
.
setDataSource
(((
GSYExoModel
)
msg
.
obj
).
getUrls
(),
((
GSYExoModel
)
msg
.
obj
).
getMapHeadData
(),
((
GSYExoModel
)
msg
.
obj
).
i
ndex
,
((
GSYExoModel
)
msg
.
obj
).
i
sCache
());
//很遗憾,EXO2的setSpeed只能在播放前生效
if
(((
GSYExoModel
)
msg
.
obj
).
getSpeed
()
!=
1
&&
((
GSYExoModel
)
msg
.
obj
).
getSpeed
()
>
0
)
{
mediaPlayer
.
setSpeed
(((
GSYExoModel
)
msg
.
obj
).
getSpeed
(),
1
);
...
...
@@ -82,7 +82,7 @@ public class GSYExoPlayerManager extends BasePlayerManager {
@Override
public
void
setNeedMute
(
boolean
needMute
)
{
if
(
mediaPlayer
!=
null
)
{
if
(
mediaPlayer
!=
null
)
{
if
(
needMute
)
{
mediaPlayer
.
setVolume
(
0
,
0
);
}
else
{
...
...
@@ -102,7 +102,7 @@ public class GSYExoPlayerManager extends BasePlayerManager {
@Override
public
void
release
()
{
if
(
mediaPlayer
!=
null
)
{
if
(
mediaPlayer
!=
null
)
{
mediaPlayer
.
setSurface
(
null
);
mediaPlayer
.
release
();
}
...
...
app/src/main/java/com/example/gsyvideoplayer/exo/GSYExoVideoManager.java
浏览文件 @
0e4651df
...
...
@@ -53,11 +53,11 @@ public class GSYExoVideoManager extends GSYVideoBaseManager {
return
new
GSYExoPlayerManager
();
}
public
void
prepare
(
List
<
String
>
urls
,
Map
<
String
,
String
>
mapHeadData
,
boolean
loop
,
float
speed
,
boolean
cache
,
File
cachePath
,
String
overrideExtension
)
{
public
void
prepare
(
List
<
String
>
urls
,
Map
<
String
,
String
>
mapHeadData
,
int
index
,
boolean
loop
,
float
speed
,
boolean
cache
,
File
cachePath
,
String
overrideExtension
)
{
if
(
urls
.
size
()
==
0
)
return
;
Message
msg
=
new
Message
();
msg
.
what
=
HANDLER_PREPARE
;
msg
.
obj
=
new
GSYExoModel
(
urls
,
mapHeadData
,
loop
,
speed
,
cache
,
cachePath
,
overrideExtension
);
msg
.
obj
=
new
GSYExoModel
(
urls
,
mapHeadData
,
index
,
loop
,
speed
,
cache
,
cachePath
,
overrideExtension
);
sendMessage
(
msg
);
if
(
needTimeOutOther
)
{
startTimeOutBuffer
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录