Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_26386469
GSYVideoPlayer
提交
d36ee07a
G
GSYVideoPlayer
项目概览
qq_26386469
/
GSYVideoPlayer
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
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,体验更适合开发者的 AI 搜索 >>
提交
d36ee07a
编写于
1月 11, 2018
作者:
G
guoshuyu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加PlayerManager,弃用EXOPlayer1,使用EXOPlayer2
上级
13451631
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
457 addition
and
249 deletion
+457
-249
app/src/main/java/com/example/gsyvideoplayer/GSYApplication.java
.../main/java/com/example/gsyvideoplayer/GSYApplication.java
+1
-1
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/GSYVideoManager.java
...c/main/java/com/shuyu/gsyvideoplayer/GSYVideoManager.java
+56
-245
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/player/EXO2PlayerManager.java
...va/com/shuyu/gsyvideoplayer/player/EXO2PlayerManager.java
+89
-0
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/player/EXOPlayerManager.java
...ava/com/shuyu/gsyvideoplayer/player/EXOPlayerManager.java
+106
-0
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/player/IJKPlayerManager.java
...ava/com/shuyu/gsyvideoplayer/player/IJKPlayerManager.java
+166
-0
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/player/IPlayerManager.java
.../java/com/shuyu/gsyvideoplayer/player/IPlayerManager.java
+31
-0
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/utils/GSYVideoType.java
...ain/java/com/shuyu/gsyvideoplayer/utils/GSYVideoType.java
+7
-2
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/video/base/GSYVideoView.java
...ava/com/shuyu/gsyvideoplayer/video/base/GSYVideoView.java
+1
-1
未找到文件。
app/src/main/java/com/example/gsyvideoplayer/GSYApplication.java
浏览文件 @
d36ee07a
...
...
@@ -29,7 +29,7 @@ public class GSYApplication extends Application {
//GSYVideoType.enableMediaCodec();
//GSYVideoType.enableMediaCodecTexture();
//GSYVideoManager.instance().setVideoType(this, GSYVideoType.IJKEXOPLAYER); //EXO 1 播放内核
//GSYVideoManager.instance().setVideoType(this, GSYVideoType.IJKEXOPLAYER); //EXO 1 播放内核
,弃用
//GSYVideoManager.instance().setVideoType(this, GSYVideoType.IJKEXOPLAYER2); //EXO 2 播放内核
//GSYVideoType.setShowType(GSYVideoType.SCREEN_MATCH_FULL);
...
...
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/GSYVideoManager.java
浏览文件 @
d36ee07a
...
...
@@ -3,16 +3,12 @@ package com.shuyu.gsyvideoplayer;
import
android.annotation.SuppressLint
;
import
android.content.Context
;
import
android.media.AudioManager
;
import
android.media.MediaPlayer
;
import
android.net.Uri
;
import
android.os.Bundle
;
import
android.os.Handler
;
import
android.os.HandlerThread
;
import
android.os.Looper
;
import
android.os.Message
;
import
android.text.TextUtils
;
import
android.util.Log
;
import
android.view.Surface
;
import
com.danikula.videocache.CacheListener
;
...
...
@@ -22,6 +18,9 @@ import com.danikula.videocache.headers.HeaderInjector;
import
com.shuyu.gsyvideoplayer.listener.GSYMediaPlayerListener
;
import
com.shuyu.gsyvideoplayer.model.GSYModel
;
import
com.shuyu.gsyvideoplayer.model.VideoOptionModel
;
import
com.shuyu.gsyvideoplayer.player.EXO2PlayerManager
;
import
com.shuyu.gsyvideoplayer.player.IJKPlayerManager
;
import
com.shuyu.gsyvideoplayer.player.IPlayerManager
;
import
com.shuyu.gsyvideoplayer.utils.GSYVideoType
;
import
com.shuyu.gsyvideoplayer.utils.CommonUtil
;
import
com.shuyu.gsyvideoplayer.utils.Debuger
;
...
...
@@ -29,20 +28,12 @@ import com.shuyu.gsyvideoplayer.utils.FileUtils;
import
com.shuyu.gsyvideoplayer.utils.StorageUtils
;
import
java.io.File
;
import
java.io.IOException
;
import
java.lang.ref.WeakReference
;
import
java.lang.reflect.Field
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
tv.danmaku.ijk.media.exo.IjkExoMediaPlayer
;
import
tv.danmaku.ijk.media.exo.demo.player.DemoPlayer
;
import
tv.danmaku.ijk.media.exo2.IjkExo2MediaPlayer
;
import
tv.danmaku.ijk.media.player.IMediaPlayer
;
import
tv.danmaku.ijk.media.player.IjkLibLoader
;
import
tv.danmaku.ijk.media.player.IjkMediaPlayer
;
import
tv.danmaku.ijk.media.player.TextureMediaPlayer
;
/**
* 视频管理,单例
...
...
@@ -69,8 +60,6 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
private
static
final
int
BUFFER_TIME_OUT_ERROR
=
-
192
;
//外部超时错误码
private
IMediaPlayer
mediaPlayer
;
private
MediaHandler
mMediaHandler
;
private
Handler
mainThreadHandler
;
...
...
@@ -100,6 +89,8 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
private
Context
context
;
private
IPlayerManager
playerManager
;
//当前播放的视频宽的高
private
int
currentVideoWidth
=
0
;
...
...
@@ -121,9 +112,6 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
//播放类型,默认IJK
private
int
videoType
=
GSYVideoType
.
IJKPLAYER
;
//log level
private
int
logLevel
=
IjkMediaPlayer
.
IJK_LOG_DEFAULT
;
//是否需要静音
private
boolean
needMute
=
false
;
...
...
@@ -176,9 +164,11 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
* 需要在instance之前设置
*/
public
static
void
setIjkLibLoader
(
IjkLibLoader
libLoader
)
{
IJKPlayerManager
.
setIjkLibLoader
(
libLoader
);
ijkLibLoader
=
libLoader
;
}
public
static
IjkLibLoader
getIjkLibLoader
()
{
return
ijkLibLoader
;
}
...
...
@@ -309,8 +299,9 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
* @param libLoader 是否使用外部动态加载so
* */
private
GSYVideoManager
(
IjkLibLoader
libLoader
)
{
mediaPlayer
=
(
libLoader
==
null
)
?
new
IjkMediaPlayer
()
:
new
IjkMediaPlayer
(
libLoader
);
playerManager
=
getPlayManager
(
GSYVideoType
.
IJKPLAYER
);
ijkLibLoader
=
libLoader
;
IJKPlayerManager
.
setIjkLibLoader
(
ijkLibLoader
);
HandlerThread
mediaHandlerThread
=
new
HandlerThread
(
TAG
);
mediaHandlerThread
.
start
();
mMediaHandler
=
new
MediaHandler
((
mediaHandlerThread
.
getLooper
()));
...
...
@@ -334,8 +325,8 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
showDisplay
(
msg
);
break
;
case
HANDLER_RELEASE:
if
(
mediaPlay
er
!=
null
)
{
mediaPlay
er
.
release
();
if
(
playerManag
er
!=
null
)
{
playerManag
er
.
release
();
}
setNeedMute
(
false
);
if
(
proxy
!=
null
)
{
...
...
@@ -356,16 +347,16 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
try
{
currentVideoWidth
=
0
;
currentVideoHeight
=
0
;
mediaPlayer
.
release
();
if
(
videoType
==
GSYVideoType
.
IJKPLAYER
)
{
initIJKPlayer
(
msg
);
}
else
if
(
videoType
==
GSYVideoType
.
IJKEXOPLAYER
)
{
initEXOPlayer
(
msg
);
}
else
if
(
videoType
==
GSYVideoType
.
IJKEXOPLAYER2
)
{
initEXOPlayer2
(
msg
);
if
(
playerManager
!=
null
)
{
playerManager
.
release
();
}
playerManager
=
getPlayManager
(
videoType
);
playerManager
.
initVideoPlayer
(
context
,
msg
,
optionModelList
);
setNeedMute
(
needMute
);
IMediaPlayer
mediaPlayer
=
playerManager
.
getMediaPlayer
();
mediaPlayer
.
setOnCompletionListener
(
GSYVideoManager
.
this
);
mediaPlayer
.
setOnBufferingUpdateListener
(
GSYVideoManager
.
this
);
mediaPlayer
.
setScreenOnWhilePlaying
(
true
);
...
...
@@ -381,91 +372,6 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
}
}
/**
* 后面再修改设计模式吧,现在先用着
*/
private
void
initIJKPlayer
(
Message
msg
)
{
mediaPlayer
=
(
ijkLibLoader
==
null
)
?
new
IjkMediaPlayer
()
:
new
IjkMediaPlayer
(
ijkLibLoader
);
mediaPlayer
.
setAudioStreamType
(
AudioManager
.
STREAM_MUSIC
);
((
IjkMediaPlayer
)
mediaPlayer
).
setOnNativeInvokeListener
(
new
IjkMediaPlayer
.
OnNativeInvokeListener
()
{
@Override
public
boolean
onNativeInvoke
(
int
i
,
Bundle
bundle
)
{
return
true
;
}
});
try
{
//开启硬解码
if
(
GSYVideoType
.
isMediaCodec
())
{
Debuger
.
printfLog
(
"enable mediaCodec"
);
((
IjkMediaPlayer
)
mediaPlayer
).
setOption
(
IjkMediaPlayer
.
OPT_CATEGORY_PLAYER
,
"mediacodec"
,
1
);
((
IjkMediaPlayer
)
mediaPlayer
).
setOption
(
IjkMediaPlayer
.
OPT_CATEGORY_PLAYER
,
"mediacodec-auto-rotate"
,
1
);
((
IjkMediaPlayer
)
mediaPlayer
).
setOption
(
IjkMediaPlayer
.
OPT_CATEGORY_PLAYER
,
"mediacodec-handle-resolution-change"
,
1
);
}
mMapHeadData
=
((
GSYModel
)
msg
.
obj
).
getMapHeadData
();
((
IjkMediaPlayer
)
mediaPlayer
).
setDataSource
(((
GSYModel
)
msg
.
obj
).
getUrl
(),
((
GSYModel
)
msg
.
obj
).
getMapHeadData
());
mediaPlayer
.
setLooping
(((
GSYModel
)
msg
.
obj
).
isLooping
());
if
(((
GSYModel
)
msg
.
obj
).
getSpeed
()
!=
1
&&
((
GSYModel
)
msg
.
obj
).
getSpeed
()
>
0
)
{
((
IjkMediaPlayer
)
mediaPlayer
).
setSpeed
(((
GSYModel
)
msg
.
obj
).
getSpeed
());
}
((
IjkMediaPlayer
)
mediaPlayer
).
native_setLogLevel
(
logLevel
);
initIJKOption
((
IjkMediaPlayer
)
mediaPlayer
);
//开启硬解码渲染优化
if
(
GSYVideoType
.
isMediaCodecTexture
())
{
IMediaPlayer
iMediaPlayer
=
new
TextureMediaPlayer
(
mediaPlayer
);
mediaPlayer
=
iMediaPlayer
;
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
/**
* 后面再修改设计模式吧,现在先用着
*/
private
void
initEXOPlayer
(
Message
msg
)
{
mediaPlayer
=
new
IjkExoMediaPlayer
(
context
);
mediaPlayer
.
setAudioStreamType
(
AudioManager
.
STREAM_MUSIC
);
mMapHeadData
=
null
;
try
{
mediaPlayer
.
setDataSource
(
context
,
Uri
.
parse
(((
GSYModel
)
msg
.
obj
).
getUrl
()),
((
GSYModel
)
msg
.
obj
).
getMapHeadData
());
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
/**
* 后面再修改设计模式吧,现在先用着
*/
private
void
initEXOPlayer2
(
Message
msg
)
{
//目前EXO2在频繁的切换Surface时会可能出现 (queueBuffer: BufferQueue has been abandoned)
mediaPlayer
=
new
IjkExo2MediaPlayer
(
context
);
mediaPlayer
.
setAudioStreamType
(
AudioManager
.
STREAM_MUSIC
);
mMapHeadData
=
null
;
try
{
mediaPlayer
.
setDataSource
(
context
,
Uri
.
parse
(((
GSYModel
)
msg
.
obj
).
getUrl
()),
((
GSYModel
)
msg
.
obj
).
getMapHeadData
());
//很遗憾,EXO2的setSpeed只能在播放前生效
if
(((
GSYModel
)
msg
.
obj
).
getSpeed
()
!=
1
&&
((
GSYModel
)
msg
.
obj
).
getSpeed
()
>
0
)
{
((
IjkExo2MediaPlayer
)
mediaPlayer
).
setSpeed
(((
GSYModel
)
msg
.
obj
).
getSpeed
(),
1
);
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
private
void
initIJKOption
(
IjkMediaPlayer
ijkMediaPlayer
)
{
if
(
optionModelList
!=
null
&&
optionModelList
.
size
()
>
0
)
{
for
(
VideoOptionModel
videoOptionModel
:
optionModelList
)
{
if
(
videoOptionModel
.
getValueType
()
==
VideoOptionModel
.
VALUE_TYPE_INT
)
{
ijkMediaPlayer
.
setOption
(
videoOptionModel
.
getCategory
(),
videoOptionModel
.
getName
(),
videoOptionModel
.
getValueInt
());
}
else
{
ijkMediaPlayer
.
setOption
(
videoOptionModel
.
getCategory
(),
videoOptionModel
.
getName
(),
videoOptionModel
.
getValueString
());
}
}
}
}
/**
* 启动十秒的定时器进行 缓存操作
...
...
@@ -509,85 +415,11 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
* 后面再修改设计模式吧,现在先用着
*/
private
void
showDisplay
(
Message
msg
)
{
if
(
mediaPlayer
instanceof
IjkMediaPlayer
)
{
showDisplayIJK
(
msg
);
}
else
if
(
mediaPlayer
instanceof
IjkExoMediaPlayer
)
{
showDisplayExo
(
msg
);
}
else
if
(
mediaPlayer
instanceof
IjkExo2MediaPlayer
)
{
showDisplayExo2
(
msg
);
if
(
playerManager
!=
null
)
{
playerManager
.
showDisplay
(
msg
);
}
}
/**
* 后面再修改设计模式吧,现在先用着
*/
private
void
showDisplayIJK
(
Message
msg
)
{
if
(
msg
.
obj
==
null
&&
mediaPlayer
!=
null
)
{
mediaPlayer
.
setSurface
(
null
);
}
else
{
Surface
holder
=
(
Surface
)
msg
.
obj
;
if
(
mediaPlayer
!=
null
&&
holder
.
isValid
())
{
mediaPlayer
.
setSurface
(
holder
);
}
}
}
/**
* 后面再修改设计模式吧,现在先用着
*/
private
void
showDisplayExo
(
Message
msg
)
{
if
(
mediaPlayer
==
null
)
{
return
;
}
IjkExoMediaPlayer
ijkExoMediaPlayer
=
(
IjkExoMediaPlayer
)
mediaPlayer
;
Class
<?>
classType
=
ijkExoMediaPlayer
.
getClass
();
DemoPlayer
demoPlayer
=
null
;
try
{
Field
field
=
classType
.
getDeclaredField
(
"mInternalPlayer"
);
field
.
setAccessible
(
true
);
// 抑制Java对修饰符的检查
demoPlayer
=
(
DemoPlayer
)
field
.
get
(
ijkExoMediaPlayer
);
}
catch
(
NoSuchFieldException
e
)
{
e
.
printStackTrace
();
}
catch
(
IllegalAccessException
e
)
{
e
.
printStackTrace
();
}
if
(
msg
.
obj
==
null
)
{
/*if (demoPlayer != null && demoPlayer.getPlayWhenReady()) {
demoPlayer.setSelectedTrack(0, -1);
}*/
mediaPlayer
.
setSurface
(
null
);
}
else
{
Surface
holder
=
(
Surface
)
msg
.
obj
;
mediaPlayer
.
setSurface
(
holder
);
if
(
mediaPlayer
!=
null
&&
mediaPlayer
.
getDuration
()
>
30
&&
mediaPlayer
.
getCurrentPosition
()
<
mediaPlayer
.
getDuration
())
{
mediaPlayer
.
seekTo
(
mediaPlayer
.
getCurrentPosition
()
-
20
);
}
/*if (mediaPlayer != null && holder.isValid()) {
if (demoPlayer != null && demoPlayer.getPlayWhenReady()) {
demoPlayer.setSelectedTrack(0, 0);
}
}*/
}
}
/**
* 后面再修改设计模式吧,现在先用着
*/
private
void
showDisplayExo2
(
Message
msg
)
{
if
(
mediaPlayer
==
null
)
{
return
;
}
if
(
msg
.
obj
==
null
)
{
mediaPlayer
.
setSurface
(
null
);
}
else
{
Surface
holder
=
(
Surface
)
msg
.
obj
;
mediaPlayer
.
setSurface
(
holder
);
}
}
/**
* for android video cache header
*/
...
...
@@ -600,34 +432,8 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
}
public
void
setSpeed
(
float
speed
,
boolean
soundTouch
)
{
if
(
speed
>
0
)
{
if
(
mediaPlayer
instanceof
IjkMediaPlayer
)
{
try
{
((
IjkMediaPlayer
)
mediaPlayer
).
setSpeed
(
speed
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
if
(
soundTouch
)
{
VideoOptionModel
videoOptionModel
=
new
VideoOptionModel
(
IjkMediaPlayer
.
OPT_CATEGORY_PLAYER
,
"soundtouch"
,
1
);
List
<
VideoOptionModel
>
list
=
getOptionModelList
();
if
(
list
!=
null
)
{
list
.
add
(
videoOptionModel
);
}
else
{
list
=
new
ArrayList
<>();
list
.
add
(
videoOptionModel
);
}
setOptionModelList
(
list
);
}
}
}
else
if
(
mediaPlayer
instanceof
IjkExo2MediaPlayer
)
{
//很遗憾,EXO2的setSpeed只能在播放前生效
Debuger
.
printfError
(
"很遗憾,目前EXO2的setSpeed只能在播放前设置生效"
);
try
{
((
IjkExo2MediaPlayer
)
mediaPlayer
).
setSpeed
(
speed
,
1
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
if
(
playerManager
!=
null
)
{
playerManager
.
setSpeed
(
speed
,
soundTouch
);
}
}
...
...
@@ -635,6 +441,7 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
if
(
TextUtils
.
isEmpty
(
url
))
return
;
Message
msg
=
new
Message
();
msg
.
what
=
HANDLER_PREPARE
;
mMapHeadData
=
mapHeadData
;
GSYModel
fb
=
new
GSYModel
(
url
,
mapHeadData
,
loop
,
speed
);
msg
.
obj
=
fb
;
mMediaHandler
.
sendMessage
(
msg
);
...
...
@@ -792,14 +599,39 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
}
}
public
IMediaPlayer
getMediaPlayer
()
{
if
(
mediaPlayer
instanceof
TextureMediaPlayer
)
{
return
((
TextureMediaPlayer
)
mediaPlayer
).
getInternal
MediaPlayer
();
if
(
playerManager
!=
null
)
{
return
playerManager
.
get
MediaPlayer
();
}
return
mediaPlayer
;
return
null
;
}
public
int
getVideoType
()
{
return
videoType
;
}
/**
* 设置了视频的播放类型,IJKEXOPLAYER和IJKEXOPLAYER2是互斥的
* GSYVideoType IJKPLAYER = 0 or IJKEXOPLAYER = 1 or IJKEXOPLAYER2 = 2;
* IJKEXOPLAYER2 must be compile com.shuyu:gsyVideoPlayer-exo2:$gsyVideoVersion
*/
public
void
setVideoType
(
Context
context
,
int
videoType
)
{
this
.
context
=
context
.
getApplicationContext
();
this
.
videoType
=
videoType
;
}
private
static
IPlayerManager
getPlayManager
(
int
videoType
)
{
switch
(
videoType
)
{
case
GSYVideoType
.
IJKEXOPLAYER2
:
return
new
EXO2PlayerManager
();
case
GSYVideoType
.
IJKPLAYER
:
default
:
return
new
IJKPlayerManager
();
}
}
public
int
getCurrentVideoWidth
()
{
return
currentVideoWidth
;
}
...
...
@@ -840,11 +672,6 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
this
.
playPosition
=
playPosition
;
}
public
int
getVideoType
()
{
return
videoType
;
}
public
List
<
VideoOptionModel
>
getOptionModelList
()
{
return
optionModelList
;
}
...
...
@@ -856,15 +683,6 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
this
.
optionModelList
=
optionModelList
;
}
/**
* 设置了视频的播放类型
* GSYVideoType IJKPLAYER = 0 or IJKEXOPLAYER = 1;
*/
public
void
setVideoType
(
Context
context
,
int
videoType
)
{
this
.
context
=
context
.
getApplicationContext
();
this
.
videoType
=
videoType
;
}
public
boolean
isNeedMute
()
{
return
needMute
;
}
...
...
@@ -874,12 +692,8 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
*/
public
void
setNeedMute
(
boolean
needMute
)
{
this
.
needMute
=
needMute
;
if
(
mediaPlayer
!=
null
)
{
if
(
needMute
)
{
mediaPlayer
.
setVolume
(
0
,
0
);
}
else
{
mediaPlayer
.
setVolume
(
1
,
1
);
}
if
(
playerManager
!=
null
)
{
playerManager
.
setNeedMute
(
needMute
);
}
}
...
...
@@ -918,10 +732,7 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
* 设置log输入等级
*/
public
void
setLogLevel
(
int
logLevel
)
{
if
(
mediaPlayer
!=
null
&&
mediaPlayer
instanceof
IjkMediaPlayer
)
{
this
.
logLevel
=
logLevel
;
((
IjkMediaPlayer
)
mediaPlayer
).
native_setLogLevel
(
logLevel
);
}
IJKPlayerManager
.
setLogLevel
(
logLevel
);
}
}
\ No newline at end of file
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/player/EXO2PlayerManager.java
0 → 100644
浏览文件 @
d36ee07a
package
com.shuyu.gsyvideoplayer.player
;
import
android.content.Context
;
import
android.media.AudioManager
;
import
android.net.Uri
;
import
android.os.Message
;
import
android.view.Surface
;
import
com.shuyu.gsyvideoplayer.model.GSYModel
;
import
com.shuyu.gsyvideoplayer.model.VideoOptionModel
;
import
com.shuyu.gsyvideoplayer.utils.Debuger
;
import
java.util.List
;
import
tv.danmaku.ijk.media.exo2.IjkExo2MediaPlayer
;
import
tv.danmaku.ijk.media.player.IMediaPlayer
;
/**
* EXOPlayer2
* Created by guoshuyu on 2018/1/11.
*/
public
class
EXO2PlayerManager
implements
IPlayerManager
{
private
IjkExo2MediaPlayer
mediaPlayer
;
@Override
public
IMediaPlayer
getMediaPlayer
()
{
return
mediaPlayer
;
}
@Override
public
void
initVideoPlayer
(
Context
context
,
Message
msg
,
List
<
VideoOptionModel
>
optionModelList
)
{
//目前EXO2在频繁的切换Surface时会可能出现 (queueBuffer: BufferQueue has been abandoned)
mediaPlayer
=
new
IjkExo2MediaPlayer
(
context
);
mediaPlayer
.
setAudioStreamType
(
AudioManager
.
STREAM_MUSIC
);
try
{
mediaPlayer
.
setDataSource
(
context
,
Uri
.
parse
(((
GSYModel
)
msg
.
obj
).
getUrl
()),
((
GSYModel
)
msg
.
obj
).
getMapHeadData
());
//很遗憾,EXO2的setSpeed只能在播放前生效
if
(((
GSYModel
)
msg
.
obj
).
getSpeed
()
!=
1
&&
((
GSYModel
)
msg
.
obj
).
getSpeed
()
>
0
)
{
mediaPlayer
.
setSpeed
(((
GSYModel
)
msg
.
obj
).
getSpeed
(),
1
);
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
@Override
public
void
showDisplay
(
Message
msg
)
{
if
(
mediaPlayer
==
null
)
{
return
;
}
if
(
msg
.
obj
==
null
)
{
mediaPlayer
.
setSurface
(
null
);
}
else
{
Surface
holder
=
(
Surface
)
msg
.
obj
;
mediaPlayer
.
setSurface
(
holder
);
}
}
@Override
public
void
setSpeed
(
float
speed
,
boolean
soundTouch
)
{
//很遗憾,EXO2的setSpeed只能在播放前生效
//Debuger.printfError("很遗憾,目前EXO2的setSpeed只能在播放前设置生效");
try
{
mediaPlayer
.
setSpeed
(
speed
,
1
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
@Override
public
void
setNeedMute
(
boolean
needMute
)
{
if
(
mediaPlayer
!=
null
)
{
if
(
needMute
)
{
mediaPlayer
.
setVolume
(
0
,
0
);
}
else
{
mediaPlayer
.
setVolume
(
1
,
1
);
}
}
}
@Override
public
void
release
()
{
if
(
mediaPlayer
!=
null
)
{
mediaPlayer
.
release
();
}
}
}
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/player/EXOPlayerManager.java
0 → 100644
浏览文件 @
d36ee07a
package
com.shuyu.gsyvideoplayer.player
;
import
android.content.Context
;
import
android.media.AudioManager
;
import
android.net.Uri
;
import
android.os.Message
;
import
android.view.Surface
;
import
com.shuyu.gsyvideoplayer.model.GSYModel
;
import
com.shuyu.gsyvideoplayer.model.VideoOptionModel
;
import
com.shuyu.gsyvideoplayer.utils.Debuger
;
import
java.io.IOException
;
import
java.lang.reflect.Field
;
import
java.util.List
;
import
tv.danmaku.ijk.media.exo.IjkExoMediaPlayer
;
import
tv.danmaku.ijk.media.exo.demo.player.DemoPlayer
;
import
tv.danmaku.ijk.media.player.IMediaPlayer
;
/**
* EXOPlayer1
* Created by guoshuyu on 2018/1/11.
*/
@Deprecated
public
class
EXOPlayerManager
implements
IPlayerManager
{
private
IjkExoMediaPlayer
mediaPlayer
;
@Override
public
IMediaPlayer
getMediaPlayer
()
{
return
mediaPlayer
;
}
@Override
public
void
initVideoPlayer
(
Context
context
,
Message
msg
,
List
<
VideoOptionModel
>
optionModelList
)
{
mediaPlayer
=
new
IjkExoMediaPlayer
(
context
);
mediaPlayer
.
setAudioStreamType
(
AudioManager
.
STREAM_MUSIC
);
try
{
mediaPlayer
.
setDataSource
(
context
,
Uri
.
parse
(((
GSYModel
)
msg
.
obj
).
getUrl
()),
((
GSYModel
)
msg
.
obj
).
getMapHeadData
());
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
@Override
public
void
showDisplay
(
Message
msg
)
{
if
(
mediaPlayer
==
null
)
{
return
;
}
Class
<?>
classType
=
mediaPlayer
.
getClass
();
DemoPlayer
demoPlayer
=
null
;
try
{
Field
field
=
classType
.
getDeclaredField
(
"mInternalPlayer"
);
field
.
setAccessible
(
true
);
// 抑制Java对修饰符的检查
demoPlayer
=
(
DemoPlayer
)
field
.
get
(
mediaPlayer
);
}
catch
(
NoSuchFieldException
e
)
{
e
.
printStackTrace
();
}
catch
(
IllegalAccessException
e
)
{
e
.
printStackTrace
();
}
if
(
msg
.
obj
==
null
)
{
/*if (demoPlayer != null && demoPlayer.getPlayWhenReady()) {
demoPlayer.setSelectedTrack(0, -1);
}*/
mediaPlayer
.
setSurface
(
null
);
}
else
{
Surface
holder
=
(
Surface
)
msg
.
obj
;
mediaPlayer
.
setSurface
(
holder
);
if
(
mediaPlayer
!=
null
&&
mediaPlayer
.
getDuration
()
>
30
&&
mediaPlayer
.
getCurrentPosition
()
<
mediaPlayer
.
getDuration
())
{
mediaPlayer
.
seekTo
(
mediaPlayer
.
getCurrentPosition
()
-
20
);
}
/*if (mediaPlayer != null && holder.isValid()) {
if (demoPlayer != null && demoPlayer.getPlayWhenReady()) {
demoPlayer.setSelectedTrack(0, 0);
}
}*/
}
}
@Override
public
void
setSpeed
(
float
speed
,
boolean
soundTouch
)
{
Debuger
.
printfError
(
"EXOPlayer1 not support setSpeed, Please User EXOPlayer2"
);
}
@Override
public
void
setNeedMute
(
boolean
needMute
)
{
if
(
mediaPlayer
!=
null
)
{
if
(
needMute
)
{
mediaPlayer
.
setVolume
(
0
,
0
);
}
else
{
mediaPlayer
.
setVolume
(
1
,
1
);
}
}
}
@Override
public
void
release
()
{
if
(
mediaPlayer
!=
null
)
{
mediaPlayer
.
release
();
}
}
}
\ No newline at end of file
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/player/IJKPlayerManager.java
0 → 100644
浏览文件 @
d36ee07a
package
com.shuyu.gsyvideoplayer.player
;
import
android.content.Context
;
import
android.media.AudioManager
;
import
android.os.Bundle
;
import
android.os.Message
;
import
android.view.Surface
;
import
com.shuyu.gsyvideoplayer.model.GSYModel
;
import
com.shuyu.gsyvideoplayer.model.VideoOptionModel
;
import
com.shuyu.gsyvideoplayer.utils.Debuger
;
import
com.shuyu.gsyvideoplayer.utils.GSYVideoType
;
import
java.io.IOException
;
import
java.util.ArrayList
;
import
java.util.List
;
import
tv.danmaku.ijk.media.player.IMediaPlayer
;
import
tv.danmaku.ijk.media.player.IjkLibLoader
;
import
tv.danmaku.ijk.media.player.IjkMediaPlayer
;
/**
* IJKPLayer
* Created by guoshuyu on 2018/1/11.
*/
public
class
IJKPlayerManager
implements
IPlayerManager
{
//log level
private
static
int
logLevel
=
IjkMediaPlayer
.
IJK_LOG_DEFAULT
;
private
static
IjkLibLoader
ijkLibLoader
;
private
IjkMediaPlayer
mediaPlayer
;
private
List
<
VideoOptionModel
>
optionModelList
;
@Override
public
IMediaPlayer
getMediaPlayer
()
{
return
mediaPlayer
;
}
@Override
public
void
initVideoPlayer
(
Context
context
,
Message
msg
,
List
<
VideoOptionModel
>
optionModelList
)
{
mediaPlayer
=
(
ijkLibLoader
==
null
)
?
new
IjkMediaPlayer
()
:
new
IjkMediaPlayer
(
ijkLibLoader
);
mediaPlayer
.
setAudioStreamType
(
AudioManager
.
STREAM_MUSIC
);
mediaPlayer
.
setOnNativeInvokeListener
(
new
IjkMediaPlayer
.
OnNativeInvokeListener
()
{
@Override
public
boolean
onNativeInvoke
(
int
i
,
Bundle
bundle
)
{
return
true
;
}
});
try
{
//开启硬解码
if
(
GSYVideoType
.
isMediaCodec
())
{
Debuger
.
printfLog
(
"enable mediaCodec"
);
mediaPlayer
.
setOption
(
IjkMediaPlayer
.
OPT_CATEGORY_PLAYER
,
"mediacodec"
,
1
);
mediaPlayer
.
setOption
(
IjkMediaPlayer
.
OPT_CATEGORY_PLAYER
,
"mediacodec-auto-rotate"
,
1
);
mediaPlayer
.
setOption
(
IjkMediaPlayer
.
OPT_CATEGORY_PLAYER
,
"mediacodec-handle-resolution-change"
,
1
);
}
mediaPlayer
.
setDataSource
(((
GSYModel
)
msg
.
obj
).
getUrl
(),
((
GSYModel
)
msg
.
obj
).
getMapHeadData
());
mediaPlayer
.
setLooping
(((
GSYModel
)
msg
.
obj
).
isLooping
());
if
(((
GSYModel
)
msg
.
obj
).
getSpeed
()
!=
1
&&
((
GSYModel
)
msg
.
obj
).
getSpeed
()
>
0
)
{
mediaPlayer
.
setSpeed
(((
GSYModel
)
msg
.
obj
).
getSpeed
());
}
mediaPlayer
.
native_setLogLevel
(
logLevel
);
initIJKOption
(
mediaPlayer
,
optionModelList
);
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
@Override
public
void
showDisplay
(
Message
msg
)
{
if
(
msg
.
obj
==
null
&&
mediaPlayer
!=
null
)
{
mediaPlayer
.
setSurface
(
null
);
}
else
{
Surface
holder
=
(
Surface
)
msg
.
obj
;
if
(
mediaPlayer
!=
null
&&
holder
.
isValid
())
{
mediaPlayer
.
setSurface
(
holder
);
}
}
}
@Override
public
void
setSpeed
(
float
speed
,
boolean
soundTouch
)
{
if
(
speed
>
0
)
{
try
{
if
(
mediaPlayer
!=
null
)
{
mediaPlayer
.
setSpeed
(
speed
);
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
if
(
soundTouch
)
{
VideoOptionModel
videoOptionModel
=
new
VideoOptionModel
(
IjkMediaPlayer
.
OPT_CATEGORY_PLAYER
,
"soundtouch"
,
1
);
List
<
VideoOptionModel
>
list
=
getOptionModelList
();
if
(
list
!=
null
)
{
list
.
add
(
videoOptionModel
);
}
else
{
list
=
new
ArrayList
<>();
list
.
add
(
videoOptionModel
);
}
setOptionModelList
(
list
);
}
}
}
@Override
public
void
setNeedMute
(
boolean
needMute
)
{
if
(
mediaPlayer
!=
null
)
{
if
(
needMute
)
{
mediaPlayer
.
setVolume
(
0
,
0
);
}
else
{
mediaPlayer
.
setVolume
(
1
,
1
);
}
}
}
@Override
public
void
release
()
{
if
(
mediaPlayer
!=
null
)
{
mediaPlayer
.
release
();
}
}
private
void
initIJKOption
(
IjkMediaPlayer
ijkMediaPlayer
,
List
<
VideoOptionModel
>
optionModelList
)
{
if
(
optionModelList
!=
null
&&
optionModelList
.
size
()
>
0
)
{
for
(
VideoOptionModel
videoOptionModel
:
optionModelList
)
{
if
(
videoOptionModel
.
getValueType
()
==
VideoOptionModel
.
VALUE_TYPE_INT
)
{
ijkMediaPlayer
.
setOption
(
videoOptionModel
.
getCategory
(),
videoOptionModel
.
getName
(),
videoOptionModel
.
getValueInt
());
}
else
{
ijkMediaPlayer
.
setOption
(
videoOptionModel
.
getCategory
(),
videoOptionModel
.
getName
(),
videoOptionModel
.
getValueString
());
}
}
}
}
public
List
<
VideoOptionModel
>
getOptionModelList
()
{
return
optionModelList
;
}
public
void
setOptionModelList
(
List
<
VideoOptionModel
>
optionModelList
)
{
this
.
optionModelList
=
optionModelList
;
}
public
static
IjkLibLoader
getIjkLibLoader
()
{
return
ijkLibLoader
;
}
public
static
void
setIjkLibLoader
(
IjkLibLoader
ijkLibLoader
)
{
IJKPlayerManager
.
ijkLibLoader
=
ijkLibLoader
;
}
public
static
int
getLogLevel
()
{
return
logLevel
;
}
public
static
void
setLogLevel
(
int
logLevel
)
{
IJKPlayerManager
.
logLevel
=
logLevel
;
}
}
\ No newline at end of file
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/player/IPlayerManager.java
0 → 100644
浏览文件 @
d36ee07a
package
com.shuyu.gsyvideoplayer.player
;
import
android.content.Context
;
import
android.os.Message
;
import
com.shuyu.gsyvideoplayer.model.VideoOptionModel
;
import
java.util.List
;
import
tv.danmaku.ijk.media.player.IMediaPlayer
;
/**
* 播放器差异管理接口
* Created by guoshuyu on 2018/1/11.
*/
public
interface
IPlayerManager
{
IMediaPlayer
getMediaPlayer
();
void
initVideoPlayer
(
Context
context
,
Message
message
,
List
<
VideoOptionModel
>
optionModelList
);
void
showDisplay
(
Message
msg
);
void
setSpeed
(
float
speed
,
boolean
soundTouch
);
void
setNeedMute
(
boolean
needMute
);
void
release
();
}
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/utils/GSYVideoType.java
浏览文件 @
d36ee07a
...
...
@@ -24,10 +24,15 @@ public class GSYVideoType {
//默认播放内核IJK
public
final
static
int
IJKPLAYER
=
0
;
//EXO 1 播放内核
public
final
static
int
IJKEXOPLAYER
=
1
;
/**
* IJKEXOPLAYER 和 IJKEXOPLAYER2 是互斥的
* IJKEXOPLAYER2 must be compile com.shuyu:gsyVideoPlayer-exo2:$gsyVideoVersion
*/
//EXO 2 播放内核
public
final
static
int
IJKEXOPLAYER2
=
2
;
//EXO 1 播放内核,弃用,现在使用的是IJKEXOPLAYER2
@Deprecated
public
final
static
int
IJKEXOPLAYER
=
IJKEXOPLAYER2
;
//gl
...
...
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/video/base/GSYVideoView.java
浏览文件 @
d36ee07a
...
...
@@ -316,7 +316,7 @@ public abstract class GSYVideoView extends GSYTextureRenderView implements GSYMe
break
;
case
AudioManager
.
AUDIOFOCUS_LOSS_TRANSIENT
:
try
{
if
(
GSYVideoManager
.
instance
().
getMediaPlayer
().
isPlaying
())
{
if
(
GSYVideoManager
.
instance
().
getMediaPlayer
()
!=
null
&&
GSYVideoManager
.
instance
().
getMediaPlayer
()
.
isPlaying
())
{
GSYVideoManager
.
instance
().
getMediaPlayer
().
pause
();
}
}
catch
(
Exception
e
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录