Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_26386469
GSYVideoPlayer
提交
503a085b
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 搜索 >>
提交
503a085b
编写于
7月 02, 2019
作者:
G
guoshuyu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加硬解码不花屏幕 demo
上级
702bc6e5
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
618 addition
and
9 deletion
+618
-9
app/src/main/AndroidManifest.xml
app/src/main/AndroidManifest.xml
+6
-0
app/src/main/java/com/example/gsyvideoplayer/GSYApplication.java
.../main/java/com/example/gsyvideoplayer/GSYApplication.java
+3
-2
app/src/main/java/com/example/gsyvideoplayer/MainActivity.java
...rc/main/java/com/example/gsyvideoplayer/MainActivity.java
+4
-1
app/src/main/java/com/example/gsyvideoplayer/RecyclerView3Activity.java
...ava/com/example/gsyvideoplayer/RecyclerView3Activity.java
+201
-0
app/src/main/java/com/example/gsyvideoplayer/mediacodec/MediaCodecRenderView.java
...ample/gsyvideoplayer/mediacodec/MediaCodecRenderView.java
+24
-0
app/src/main/java/com/example/gsyvideoplayer/mediacodec/MediaCodecTextureView.java
...mple/gsyvideoplayer/mediacodec/MediaCodecTextureView.java
+292
-0
app/src/main/java/com/example/gsyvideoplayer/mediacodec/MediaCodecVideo.java
...om/example/gsyvideoplayer/mediacodec/MediaCodecVideo.java
+51
-0
app/src/main/java/com/example/gsyvideoplayer/utils/JumpUtils.java
...main/java/com/example/gsyvideoplayer/utils/JumpUtils.java
+13
-0
app/src/main/res/layout/activity_main.xml
app/src/main/res/layout/activity_main.xml
+9
-0
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/render/view/GSYTextureView.java
.../com/shuyu/gsyvideoplayer/render/view/GSYTextureView.java
+13
-4
gsyVideoPlayer/build.gradle
gsyVideoPlayer/build.gradle
+2
-2
未找到文件。
app/src/main/AndroidManifest.xml
浏览文件 @
503a085b
...
...
@@ -194,6 +194,12 @@
android:theme=
"@style/Theme.AppCompat.Transitions"
android:screenOrientation=
"portrait"
/>
<activity
android:name=
".RecyclerView3Activity"
android:configChanges=
"orientation|keyboardHidden|screenSize"
android:theme=
"@style/Theme.AppCompat.Transitions"
android:screenOrientation=
"portrait"
/>
<meta-data
android:name=
"android.max_aspect"
android:value=
"2.1"
/>
...
...
app/src/main/java/com/example/gsyvideoplayer/GSYApplication.java
浏览文件 @
503a085b
...
...
@@ -12,6 +12,7 @@ import com.google.android.exoplayer2.C;
import
com.google.android.exoplayer2.source.MediaSource
;
import
com.google.android.exoplayer2.source.hls.HlsMediaSource
;
import
com.shuyu.gsyvideoplayer.player.PlayerFactory
;
import
com.shuyu.gsyvideoplayer.utils.GSYVideoType
;
import
com.squareup.leakcanary.LeakCanary
;
import
java.io.File
;
...
...
@@ -34,8 +35,8 @@ public class GSYApplication extends MultiDexApplication {
}
LeakCanary
.
install
(
this
);
//
GSYVideoType.enableMediaCodec();
//
GSYVideoType.enableMediaCodecTexture();
GSYVideoType
.
enableMediaCodec
();
GSYVideoType
.
enableMediaCodecTexture
();
//PlayerFactory.setPlayManager(Exo2PlayerManager.class);//EXO模式
//ExoSourceManager.setSkipSSLChain(true);
...
...
app/src/main/java/com/example/gsyvideoplayer/MainActivity.java
浏览文件 @
503a085b
...
...
@@ -54,7 +54,7 @@ public class MainActivity extends AppCompatActivity {
@OnClick
({
R
.
id
.
open_btn
,
R
.
id
.
list_btn
,
R
.
id
.
list_btn_2
,
R
.
id
.
list_detail
,
R
.
id
.
clear_cache
,
R
.
id
.
recycler
,
R
.
id
.
recycler_2
,
R
.
id
.
list_detail_list
,
R
.
id
.
web_detail
,
R
.
id
.
danmaku_video
,
R
.
id
.
fragment_video
,
R
.
id
.
more_type
,
R
.
id
.
input_type
,
R
.
id
.
open_btn_empty
,
R
.
id
.
open_control
,
R
.
id
.
open_filter
,
R
.
id
.
open_btn_pick
,
R
.
id
.
open_btn_auto
,
R
.
id
.
open_scroll
,
R
.
id
.
open_window
,
R
.
id
.
open_btn_ad
,
R
.
id
.
open_btn_multi
,
R
.
id
.
open_btn_ad2
,
R
.
id
.
open_list_ad
,
R
.
id
.
open_custom_exo
,
R
.
id
.
open_simple
,
R
.
id
.
open_switch
})
R
.
id
.
open_btn_multi
,
R
.
id
.
open_btn_ad2
,
R
.
id
.
open_list_ad
,
R
.
id
.
open_custom_exo
,
R
.
id
.
open_simple
,
R
.
id
.
open_switch
,
R
.
id
.
media_codec
})
public
void
onClick
(
View
view
)
{
switch
(
view
.
getId
())
{
case
R
.
id
.
open_simple
:
...
...
@@ -156,6 +156,9 @@ public class MainActivity extends AppCompatActivity {
case
R
.
id
.
open_switch
:
JumpUtils
.
goToSwitch
(
this
);
break
;
case
R
.
id
.
media_codec
:
JumpUtils
.
goMediaCodec
(
this
);
break
;
case
R
.
id
.
clear_cache
:
//清理缓存
GSYVideoManager
.
instance
().
clearAllDefaultCache
(
MainActivity
.
this
);
...
...
app/src/main/java/com/example/gsyvideoplayer/RecyclerView3Activity.java
0 → 100644
浏览文件 @
503a085b
package
com.example.gsyvideoplayer
;
import
android.graphics.Point
;
import
android.os.Build
;
import
android.os.Bundle
;
import
android.transition.Explode
;
import
android.view.Window
;
import
android.widget.FrameLayout
;
import
androidx.annotation.NonNull
;
import
androidx.annotation.Nullable
;
import
androidx.appcompat.app.AppCompatActivity
;
import
androidx.recyclerview.widget.LinearLayoutManager
;
import
androidx.recyclerview.widget.RecyclerView
;
import
com.example.gsyvideoplayer.adapter.RecyclerBaseAdapter
;
import
com.example.gsyvideoplayer.holder.RecyclerItemViewHolder
;
import
com.example.gsyvideoplayer.mediacodec.MediaCodecVideo
;
import
com.example.gsyvideoplayer.model.VideoModel
;
import
com.shuyu.gsyvideoplayer.GSYVideoManager
;
import
com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
;
import
com.shuyu.gsyvideoplayer.utils.CommonUtil
;
import
com.shuyu.gsyvideoplayer.utils.Debuger
;
import
com.shuyu.gsyvideoplayer.utils.GSYVideoHelper
;
import
com.shuyu.gsyvideoplayer.utils.GSYVideoType
;
import
java.util.ArrayList
;
import
java.util.List
;
import
butterknife.BindView
;
import
butterknife.ButterKnife
;
/**
* MediaCodec
*/
public
class
RecyclerView3Activity
extends
AppCompatActivity
{
@BindView
(
R
.
id
.
list_item_recycler
)
RecyclerView
listItemRecycler
;
@BindView
(
R
.
id
.
video_full_container
)
FrameLayout
videoFullContainer
;
LinearLayoutManager
linearLayoutManager
;
RecyclerBaseAdapter
recyclerBaseAdapter
;
List
<
VideoModel
>
dataList
=
new
ArrayList
<>();
GSYVideoHelper
smallVideoHelper
;
GSYVideoHelper
.
GSYVideoHelperBuilder
gsySmallVideoHelperBuilder
;
int
lastVisibleItem
;
int
firstVisibleItem
;
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
// 设置一个exit transition
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
LOLLIPOP
)
{
getWindow
().
requestFeature
(
Window
.
FEATURE_CONTENT_TRANSITIONS
);
getWindow
().
setEnterTransition
(
new
Explode
());
getWindow
().
setExitTransition
(
new
Explode
());
}
super
.
onCreate
(
savedInstanceState
);
setContentView
(
R
.
layout
.
activity_recycler_view2
);
ButterKnife
.
bind
(
this
);
initView
();
listItemRecycler
.
addOnScrollListener
(
new
RecyclerView
.
OnScrollListener
()
{
@Override
public
void
onScrollStateChanged
(
@NonNull
RecyclerView
recyclerView
,
int
newState
)
{
super
.
onScrollStateChanged
(
recyclerView
,
newState
);
}
@Override
public
void
onScrolled
(
@NonNull
RecyclerView
recyclerView
,
int
dx
,
int
dy
)
{
super
.
onScrolled
(
recyclerView
,
dx
,
dy
);
firstVisibleItem
=
linearLayoutManager
.
findFirstVisibleItemPosition
();
lastVisibleItem
=
linearLayoutManager
.
findLastVisibleItemPosition
();
Debuger
.
printfLog
(
"firstVisibleItem "
+
firstVisibleItem
+
" lastVisibleItem "
+
lastVisibleItem
);
//大于0说明有播放,//对应的播放列表TAG
if
(
smallVideoHelper
.
getPlayPosition
()
>=
0
&&
smallVideoHelper
.
getPlayTAG
().
equals
(
RecyclerItemViewHolder
.
TAG
))
{
//当前播放的位置
int
position
=
smallVideoHelper
.
getPlayPosition
();
//不可视的是时候
if
((
position
<
firstVisibleItem
||
position
>
lastVisibleItem
))
{
//如果是小窗口就不需要处理
if
(!
smallVideoHelper
.
isSmall
()
&&
!
smallVideoHelper
.
isFull
())
{
//小窗口
int
size
=
CommonUtil
.
dip2px
(
RecyclerView3Activity
.
this
,
150
);
//actionbar为true才不会掉下面去
smallVideoHelper
.
showSmallVideo
(
new
Point
(
size
,
size
),
true
,
true
);
}
}
else
{
if
(
smallVideoHelper
.
isSmall
())
{
smallVideoHelper
.
smallVideoToNormal
();
}
}
}
}
});
}
@Override
protected
void
onStart
()
{
super
.
onStart
();
/// 打开硬解码
GSYVideoType
.
enableMediaCodec
();
}
@Override
protected
void
onDestroy
()
{
super
.
onDestroy
();
/// 关闭硬解码
GSYVideoType
.
disableMediaCodec
();
smallVideoHelper
.
releaseVideoPlayer
();
GSYVideoManager
.
releaseAllVideos
();
}
@Override
public
void
onBackPressed
()
{
if
(
smallVideoHelper
.
backFromFull
())
{
return
;
}
super
.
onBackPressed
();
}
private
void
initView
()
{
linearLayoutManager
=
new
LinearLayoutManager
(
this
);
listItemRecycler
.
setLayoutManager
(
linearLayoutManager
);
resolveData
();
recyclerBaseAdapter
=
new
RecyclerBaseAdapter
(
this
,
dataList
);
listItemRecycler
.
setAdapter
(
recyclerBaseAdapter
);
smallVideoHelper
=
new
GSYVideoHelper
(
this
,
new
MediaCodecVideo
(
this
));
smallVideoHelper
.
setFullViewContainer
(
videoFullContainer
);
//配置
gsySmallVideoHelperBuilder
=
new
GSYVideoHelper
.
GSYVideoHelperBuilder
();
gsySmallVideoHelperBuilder
.
setHideActionBar
(
true
)
.
setHideStatusBar
(
true
)
.
setNeedLockFull
(
true
)
.
setCacheWithPlay
(
true
)
.
setAutoFullWithSize
(
false
)
.
setShowFullAnimation
(
false
)
.
setLockLand
(
true
).
setVideoAllCallBack
(
new
GSYSampleCallBack
()
{
@Override
public
void
onPrepared
(
String
url
,
Object
...
objects
)
{
super
.
onPrepared
(
url
,
objects
);
Debuger
.
printfLog
(
"Duration "
+
smallVideoHelper
.
getGsyVideoPlayer
().
getDuration
()
+
" CurrentPosition "
+
smallVideoHelper
.
getGsyVideoPlayer
().
getCurrentPositionWhenPlaying
());
}
@Override
public
void
onQuitSmallWidget
(
String
url
,
Object
...
objects
)
{
super
.
onQuitSmallWidget
(
url
,
objects
);
//大于0说明有播放,//对应的播放列表TAG
if
(
smallVideoHelper
.
getPlayPosition
()
>=
0
&&
smallVideoHelper
.
getPlayTAG
().
equals
(
RecyclerItemViewHolder
.
TAG
))
{
//当前播放的位置
int
position
=
smallVideoHelper
.
getPlayPosition
();
//不可视的是时候
if
((
position
<
firstVisibleItem
||
position
>
lastVisibleItem
))
{
//释放掉视频
smallVideoHelper
.
releaseVideoPlayer
();
recyclerBaseAdapter
.
notifyDataSetChanged
();
}
}
}
});
smallVideoHelper
.
setGsyVideoOptionBuilder
(
gsySmallVideoHelperBuilder
);
recyclerBaseAdapter
.
setVideoHelper
(
smallVideoHelper
,
gsySmallVideoHelperBuilder
);
}
private
void
resolveData
()
{
for
(
int
i
=
0
;
i
<
19
;
i
++)
{
VideoModel
videoModel
=
new
VideoModel
();
dataList
.
add
(
videoModel
);
}
if
(
recyclerBaseAdapter
!=
null
)
recyclerBaseAdapter
.
notifyDataSetChanged
();
}
}
app/src/main/java/com/example/gsyvideoplayer/mediacodec/MediaCodecRenderView.java
0 → 100644
浏览文件 @
503a085b
package
com.example.gsyvideoplayer.mediacodec
;
import
android.content.Context
;
import
android.view.ViewGroup
;
import
com.example.gsyvideoplayer.view.CustomTextureSurface
;
import
com.shuyu.gsyvideoplayer.render.GSYRenderView
;
import
com.shuyu.gsyvideoplayer.render.glrender.GSYVideoGLViewBaseRender
;
import
com.shuyu.gsyvideoplayer.render.view.GSYVideoGLView
;
import
com.shuyu.gsyvideoplayer.render.view.listener.IGSYSurfaceListener
;
import
com.shuyu.gsyvideoplayer.utils.MeasureHelper
;
/**
* 自定义代理渲染层
* Created by guoshuyu on 2018/1/30.
*/
public
class
MediaCodecRenderView
extends
GSYRenderView
{
@Override
public
void
addView
(
Context
context
,
ViewGroup
textureViewContainer
,
int
rotate
,
IGSYSurfaceListener
gsySurfaceListener
,
MeasureHelper
.
MeasureFormVideoParamsListener
videoParamsListener
,
GSYVideoGLView
.
ShaderInterface
effect
,
float
[]
transform
,
GSYVideoGLViewBaseRender
customRender
,
int
mode
)
{
mShowView
=
MediaCodecTextureView
.
addTextureView
(
context
,
textureViewContainer
,
rotate
,
gsySurfaceListener
,
videoParamsListener
);
}
}
app/src/main/java/com/example/gsyvideoplayer/mediacodec/MediaCodecTextureView.java
0 → 100644
浏览文件 @
503a085b
package
com.example.gsyvideoplayer.mediacodec
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.graphics.Matrix
;
import
android.graphics.SurfaceTexture
;
import
android.util.AttributeSet
;
import
android.view.Surface
;
import
android.view.TextureView
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
com.shuyu.gsyvideoplayer.listener.GSYVideoShotListener
;
import
com.shuyu.gsyvideoplayer.listener.GSYVideoShotSaveListener
;
import
com.shuyu.gsyvideoplayer.render.GSYRenderView
;
import
com.shuyu.gsyvideoplayer.render.glrender.GSYVideoGLViewBaseRender
;
import
com.shuyu.gsyvideoplayer.render.view.GSYVideoGLView
;
import
com.shuyu.gsyvideoplayer.render.view.IGSYRenderView
;
import
com.shuyu.gsyvideoplayer.render.view.listener.IGSYSurfaceListener
;
import
com.shuyu.gsyvideoplayer.utils.Debuger
;
import
com.shuyu.gsyvideoplayer.utils.FileUtils
;
import
com.shuyu.gsyvideoplayer.utils.MeasureHelper
;
import
java.io.File
;
/**
* 用于硬解码
* Created by shuyu on 2016/11/11.
*/
public
class
MediaCodecTextureView
extends
TextureView
implements
TextureView
.
SurfaceTextureListener
,
IGSYRenderView
,
MeasureHelper
.
MeasureFormVideoParamsListener
{
private
IGSYSurfaceListener
mIGSYSurfaceListener
;
private
MeasureHelper
.
MeasureFormVideoParamsListener
mVideoParamsListener
;
private
MeasureHelper
measureHelper
;
private
SurfaceTexture
mSaveTexture
;
private
Surface
mSurface
;
public
MediaCodecTextureView
(
Context
context
)
{
super
(
context
);
init
();
}
public
MediaCodecTextureView
(
Context
context
,
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
init
();
}
private
void
init
()
{
measureHelper
=
new
MeasureHelper
(
this
,
this
);
}
@Override
protected
void
onMeasure
(
int
widthMeasureSpec
,
int
heightMeasureSpec
)
{
measureHelper
.
prepareMeasure
(
widthMeasureSpec
,
heightMeasureSpec
,
(
int
)
getRotation
());
setMeasuredDimension
(
measureHelper
.
getMeasuredWidth
(),
measureHelper
.
getMeasuredHeight
());
}
@Override
public
void
onSurfaceTextureAvailable
(
SurfaceTexture
texture
,
int
width
,
int
height
)
{
if
(
mSaveTexture
==
null
)
{
mSaveTexture
=
texture
;
mSurface
=
new
Surface
(
texture
);
if
(
mIGSYSurfaceListener
!=
null
)
{
mIGSYSurfaceListener
.
onSurfaceAvailable
(
mSurface
);
}
}
else
{
setSurfaceTexture
(
mSaveTexture
);
}
}
@Override
public
void
onSurfaceTextureSizeChanged
(
SurfaceTexture
surface
,
int
width
,
int
height
)
{
if
(
mIGSYSurfaceListener
!=
null
)
{
mIGSYSurfaceListener
.
onSurfaceSizeChanged
(
mSurface
,
width
,
height
);
}
}
@Override
public
boolean
onSurfaceTextureDestroyed
(
SurfaceTexture
surface
)
{
//清空释放
if
(
mIGSYSurfaceListener
!=
null
)
{
mIGSYSurfaceListener
.
onSurfaceDestroyed
(
mSurface
);
}
return
(
mSaveTexture
==
null
);
}
@Override
public
void
onSurfaceTextureUpdated
(
SurfaceTexture
surface
)
{
//如果播放的是暂停全屏了
if
(
mIGSYSurfaceListener
!=
null
)
{
mIGSYSurfaceListener
.
onSurfaceUpdated
(
mSurface
);
}
}
@Override
public
IGSYSurfaceListener
getIGSYSurfaceListener
()
{
return
mIGSYSurfaceListener
;
}
@Override
public
void
setIGSYSurfaceListener
(
IGSYSurfaceListener
surfaceListener
)
{
setSurfaceTextureListener
(
this
);
mIGSYSurfaceListener
=
surfaceListener
;
}
@Override
public
int
getSizeH
()
{
return
getHeight
();
}
@Override
public
int
getSizeW
()
{
return
getWidth
();
}
/**
* 暂停时初始化位图
*/
@Override
public
Bitmap
initCover
()
{
Bitmap
bitmap
=
Bitmap
.
createBitmap
(
getSizeW
(),
getSizeH
(),
Bitmap
.
Config
.
RGB_565
);
return
getBitmap
(
bitmap
);
}
/**
* 暂停时初始化位图
*/
@Override
public
Bitmap
initCoverHigh
()
{
Bitmap
bitmap
=
Bitmap
.
createBitmap
(
getSizeW
(),
getSizeH
(),
Bitmap
.
Config
.
ARGB_8888
);
return
getBitmap
(
bitmap
);
}
/**
* 获取截图
*
* @param shotHigh 是否需要高清的
*/
@Override
public
void
taskShotPic
(
GSYVideoShotListener
gsyVideoShotListener
,
boolean
shotHigh
)
{
if
(
shotHigh
)
{
gsyVideoShotListener
.
getBitmap
(
initCoverHigh
());
}
else
{
gsyVideoShotListener
.
getBitmap
(
initCover
());
}
}
/**
* 保存截图
*
* @param high 是否需要高清的
*/
@Override
public
void
saveFrame
(
final
File
file
,
final
boolean
high
,
final
GSYVideoShotSaveListener
gsyVideoShotSaveListener
)
{
GSYVideoShotListener
gsyVideoShotListener
=
new
GSYVideoShotListener
()
{
@Override
public
void
getBitmap
(
Bitmap
bitmap
)
{
if
(
bitmap
==
null
)
{
gsyVideoShotSaveListener
.
result
(
false
,
file
);
}
else
{
FileUtils
.
saveBitmap
(
bitmap
,
file
);
gsyVideoShotSaveListener
.
result
(
true
,
file
);
}
}
};
if
(
high
)
{
gsyVideoShotListener
.
getBitmap
(
initCoverHigh
());
}
else
{
gsyVideoShotListener
.
getBitmap
(
initCover
());
}
}
@Override
public
View
getRenderView
()
{
return
this
;
}
@Override
public
void
onRenderResume
()
{
Debuger
.
printfLog
(
getClass
().
getSimpleName
()
+
" not support onRenderResume now"
);
}
@Override
public
void
onRenderPause
()
{
Debuger
.
printfLog
(
getClass
().
getSimpleName
()
+
" not support onRenderPause now"
);
}
@Override
public
void
releaseRenderAll
()
{
Debuger
.
printfLog
(
getClass
().
getSimpleName
()
+
" not support releaseRenderAll now"
);
}
@Override
public
void
setRenderMode
(
int
mode
)
{
Debuger
.
printfLog
(
getClass
().
getSimpleName
()
+
" not support setRenderMode now"
);
}
@Override
public
void
setRenderTransform
(
Matrix
transform
)
{
setTransform
(
transform
);
}
@Override
public
void
setGLRenderer
(
GSYVideoGLViewBaseRender
renderer
)
{
Debuger
.
printfLog
(
getClass
().
getSimpleName
()
+
" not support setGLRenderer now"
);
}
@Override
public
void
setGLMVPMatrix
(
float
[]
MVPMatrix
)
{
Debuger
.
printfLog
(
getClass
().
getSimpleName
()
+
" not support setGLMVPMatrix now"
);
}
/**
* 设置滤镜效果
*/
@Override
public
void
setGLEffectFilter
(
GSYVideoGLView
.
ShaderInterface
effectFilter
)
{
Debuger
.
printfLog
(
getClass
().
getSimpleName
()
+
" not support setGLEffectFilter now"
);
}
@Override
public
void
setVideoParamsListener
(
MeasureHelper
.
MeasureFormVideoParamsListener
listener
)
{
mVideoParamsListener
=
listener
;
}
@Override
public
int
getCurrentVideoWidth
()
{
if
(
mVideoParamsListener
!=
null
)
{
return
mVideoParamsListener
.
getCurrentVideoWidth
();
}
return
0
;
}
@Override
public
int
getCurrentVideoHeight
()
{
if
(
mVideoParamsListener
!=
null
)
{
return
mVideoParamsListener
.
getCurrentVideoHeight
();
}
return
0
;
}
@Override
public
int
getVideoSarNum
()
{
if
(
mVideoParamsListener
!=
null
)
{
return
mVideoParamsListener
.
getVideoSarNum
();
}
return
0
;
}
@Override
public
int
getVideoSarDen
()
{
if
(
mVideoParamsListener
!=
null
)
{
return
mVideoParamsListener
.
getVideoSarDen
();
}
return
0
;
}
public
void
release
()
{
mSaveTexture
=
null
;
}
/**
* 添加播放的view
*/
public
static
MediaCodecTextureView
addTextureView
(
Context
context
,
ViewGroup
textureViewContainer
,
int
rotate
,
final
IGSYSurfaceListener
gsySurfaceListener
,
final
MeasureHelper
.
MeasureFormVideoParamsListener
videoParamsListener
)
{
if
(
textureViewContainer
.
getChildCount
()
>
0
)
{
textureViewContainer
.
removeAllViews
();
}
MediaCodecTextureView
gsyTextureView
=
new
MediaCodecTextureView
(
context
);
gsyTextureView
.
setIGSYSurfaceListener
(
gsySurfaceListener
);
gsyTextureView
.
setVideoParamsListener
(
videoParamsListener
);
gsyTextureView
.
setRotation
(
rotate
);
GSYRenderView
.
addToParent
(
textureViewContainer
,
gsyTextureView
);
return
gsyTextureView
;
}
}
\ No newline at end of file
app/src/main/java/com/example/gsyvideoplayer/mediacodec/MediaCodecVideo.java
0 → 100644
浏览文件 @
503a085b
package
com.example.gsyvideoplayer.mediacodec
;
import
android.content.Context
;
import
android.util.AttributeSet
;
import
android.view.Surface
;
import
com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
;
import
com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer
;
public
class
MediaCodecVideo
extends
StandardGSYVideoPlayer
{
public
MediaCodecVideo
(
Context
context
,
Boolean
fullFlag
)
{
super
(
context
,
fullFlag
);
}
public
MediaCodecVideo
(
Context
context
)
{
super
(
context
);
}
public
MediaCodecVideo
(
Context
context
,
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
}
@Override
public
GSYBaseVideoPlayer
startWindowFullscreen
(
Context
context
,
boolean
actionBar
,
boolean
statusBar
)
{
return
super
.
startWindowFullscreen
(
context
,
actionBar
,
statusBar
);
}
@Override
public
void
onSurfaceAvailable
(
Surface
surface
)
{
super
.
onSurfaceAvailable
(
surface
);
}
@Override
public
boolean
onSurfaceDestroyed
(
Surface
surface
)
{
//清空释放
//setDisplay(null);
//同一消息队列中去release
//releaseSurface(surface);
return
true
;
}
@Override
protected
void
addTextureView
()
{
mTextureView
=
new
MediaCodecRenderView
();
mTextureView
.
addView
(
getContext
(),
mTextureViewContainer
,
mRotate
,
this
,
this
,
mEffectFilter
,
mMatrixGL
,
mRenderer
,
mMode
);
}
}
app/src/main/java/com/example/gsyvideoplayer/utils/JumpUtils.java
浏览文件 @
503a085b
...
...
@@ -27,6 +27,7 @@ import com.example.gsyvideoplayer.PlayEmptyControlActivity;
import
com.example.gsyvideoplayer.PlayPickActivity
;
import
com.example.gsyvideoplayer.R
;
import
com.example.gsyvideoplayer.RecyclerView2Activity
;
import
com.example.gsyvideoplayer.RecyclerView3Activity
;
import
com.example.gsyvideoplayer.RecyclerViewActivity
;
import
com.example.gsyvideoplayer.ScrollingActivity
;
import
com.example.gsyvideoplayer.WebDetailActivity
;
...
...
@@ -155,6 +156,18 @@ public class JumpUtils {
ActivityCompat
.
startActivity
(
activity
,
intent
,
activityOptions
.
toBundle
());
}
/**
* 跳转到硬解码
*
* @param activity
*/
public
static
void
goMediaCodec
(
Activity
activity
)
{
Intent
intent
=
new
Intent
(
activity
,
RecyclerView3Activity
.
class
);
ActivityOptionsCompat
activityOptions
=
ActivityOptionsCompat
.
makeSceneTransitionAnimation
(
activity
);
ActivityCompat
.
startActivity
(
activity
,
intent
,
activityOptions
.
toBundle
());
}
/**
* 跳转到详情播放
*
...
...
app/src/main/res/layout/activity_main.xml
浏览文件 @
503a085b
...
...
@@ -195,6 +195,15 @@
android:layout_marginTop=
"20dp"
android:text=
"列表带广告模式"
/>
<Button
android:id=
"@+id/media_codec"
android:layout_width=
"240dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"20dp"
android:text=
"硬解码支持"
/>
<Button
android:id=
"@+id/open_custom_exo"
android:layout_width=
"240dp"
...
...
gsyVideoPlayer-java/src/main/java/com/shuyu/gsyvideoplayer/render/view/GSYTextureView.java
浏览文件 @
503a085b
...
...
@@ -34,6 +34,7 @@ public class GSYTextureView extends TextureView implements TextureView.SurfaceTe
private
MeasureHelper
measureHelper
;
private
SurfaceTexture
mSaveTexture
;
private
Surface
mSurface
;
public
GSYTextureView
(
Context
context
)
{
...
...
@@ -58,9 +59,17 @@ public class GSYTextureView extends TextureView implements TextureView.SurfaceTe
@Override
public
void
onSurfaceTextureAvailable
(
SurfaceTexture
surface
,
int
width
,
int
height
)
{
mSurface
=
new
Surface
(
surface
);
if
(
mIGSYSurfaceListener
!=
null
)
{
mIGSYSurfaceListener
.
onSurfaceAvailable
(
mSurface
);
if
(
mSaveTexture
==
null
)
{
Debuger
.
printfError
(
"FFFFFFFFFFFF 1"
);
mSaveTexture
=
surface
;
mSurface
=
new
Surface
(
surface
);
if
(
mIGSYSurfaceListener
!=
null
)
{
mIGSYSurfaceListener
.
onSurfaceAvailable
(
mSurface
);
}
}
else
{
setSurfaceTexture
(
mSaveTexture
);
Debuger
.
printfError
(
"FFFFFFFFFFFF 2"
);
//mSurface = new Surface(mSaveTexture);
}
}
...
...
@@ -77,7 +86,7 @@ public class GSYTextureView extends TextureView implements TextureView.SurfaceTe
if
(
mIGSYSurfaceListener
!=
null
)
{
mIGSYSurfaceListener
.
onSurfaceDestroyed
(
mSurface
);
}
return
true
;
return
(
mSaveTexture
==
null
)
;
}
@Override
...
...
gsyVideoPlayer/build.gradle
浏览文件 @
503a085b
...
...
@@ -35,7 +35,7 @@ android {
dependencies
{
implementation
fileTree
(
dir:
'libs'
,
include:
[
'*.jar'
])
//
api project(':gsyVideoPlayer-java')
api
project
(
':gsyVideoPlayer-java'
)
//api project(':gsyVideoPlayer-exo_player2')
//api project(':gsyVideoPlayer-armv5')
//api project(':gsyVideoPlayer-armv7a')
...
...
@@ -48,7 +48,7 @@ dependencies {
//api "com.shuyu:GSYVideoPlayer:$gsyVideoVersion"
api
"com.shuyu:gsyVideoPlayer-java:$gsyVideoVersion"
//
api "com.shuyu:gsyVideoPlayer-java:$gsyVideoVersion"
api
"com.shuyu:GSYVideoPlayer-exo2:$gsyVideoVersion"
api
"com.shuyu:gsyVideoPlayer-armv5:$gsyVideoVersion"
api
"com.shuyu:gsyVideoPlayer-armv7a:$gsyVideoVersion"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录