Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_26386469
GSYVideoPlayer
提交
a5346727
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 搜索 >>
提交
a5346727
编写于
12月 11, 2016
作者:
S
shuyu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1.4.6 修正了预览
上级
37f49e7e
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
216 addition
and
104 deletion
+216
-104
app/src/main/java/com/example/gsyvideoplayer/DetailPlayer.java
...rc/main/java/com/example/gsyvideoplayer/DetailPlayer.java
+3
-1
gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/GSYPreViewManager.java
...main/java/com/shuyu/gsyvideoplayer/GSYPreViewManager.java
+146
-0
gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/video/CustomGSYVideoPlayer.java
.../com/shuyu/gsyvideoplayer/video/CustomGSYVideoPlayer.java
+65
-101
gsyVideoPlayer/src/main/res/layout/video_layout_custom.xml
gsyVideoPlayer/src/main/res/layout/video_layout_custom.xml
+2
-2
未找到文件。
app/src/main/java/com/example/gsyvideoplayer/DetailPlayer.java
浏览文件 @
a5346727
...
...
@@ -10,6 +10,7 @@ import android.widget.ImageView;
import
android.widget.RelativeLayout
;
import
com.example.gsyvideoplayer.listener.SampleListener
;
import
com.shuyu.gsyvideoplayer.GSYPreViewManager
;
import
com.shuyu.gsyvideoplayer.GSYVideoPlayer
;
import
com.shuyu.gsyvideoplayer.utils.OrientationUtils
;
...
...
@@ -42,7 +43,7 @@ public class DetailPlayer extends AppCompatActivity {
ButterKnife
.
bind
(
this
);
String
url
=
"http://baobab.wdjcdn.com/14564977406580.mp4"
;
detailPlayer
.
setUp
(
url
,
tru
e
,
null
,
"测试视频"
);
detailPlayer
.
setUp
(
url
,
fals
e
,
null
,
"测试视频"
);
//增加封面
ImageView
imageView
=
new
ImageView
(
this
);
...
...
@@ -136,6 +137,7 @@ public class DetailPlayer extends AppCompatActivity {
protected
void
onDestroy
()
{
super
.
onDestroy
();
GSYVideoPlayer
.
releaseAllVideos
();
GSYPreViewManager
.
instance
().
releaseMediaPlayer
();
if
(
orientationUtils
!=
null
)
orientationUtils
.
releaseListener
();
}
...
...
gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/GSYPreViewManager.java
0 → 100644
浏览文件 @
a5346727
package
com.shuyu.gsyvideoplayer
;
import
android.media.AudioManager
;
import
android.os.Handler
;
import
android.os.HandlerThread
;
import
android.os.Looper
;
import
android.os.Message
;
import
android.text.TextUtils
;
import
android.view.Surface
;
import
com.shuyu.gsyvideoplayer.model.GSYModel
;
import
java.io.IOException
;
import
java.util.Map
;
import
tv.danmaku.ijk.media.player.AbstractMediaPlayer
;
import
tv.danmaku.ijk.media.player.IMediaPlayer
;
import
tv.danmaku.ijk.media.player.IjkMediaPlayer
;
/**
* Created by shuyu on 2016/12/11.
*/
public
class
GSYPreViewManager
implements
IMediaPlayer
.
OnPreparedListener
{
public
static
String
TAG
=
"GSYPreViewManager"
;
private
static
GSYPreViewManager
videoManager
;
public
static
final
int
HANDLER_PREPARE
=
0
;
public
static
final
int
HANDLER_SETDISPLAY
=
1
;
public
static
final
int
HANDLER_RELEASE
=
2
;
private
IjkMediaPlayer
mediaPlayer
;
private
HandlerThread
mMediaHandlerThread
;
private
GSYPreViewManager
.
MediaHandler
mMediaHandler
;
public
static
synchronized
GSYPreViewManager
instance
()
{
if
(
videoManager
==
null
)
{
videoManager
=
new
GSYPreViewManager
();
}
return
videoManager
;
}
public
GSYPreViewManager
()
{
mediaPlayer
=
new
IjkMediaPlayer
();
mMediaHandlerThread
=
new
HandlerThread
(
TAG
);
mMediaHandlerThread
.
start
();
mMediaHandler
=
new
GSYPreViewManager
.
MediaHandler
((
mMediaHandlerThread
.
getLooper
()));
}
public
class
MediaHandler
extends
Handler
{
public
MediaHandler
(
Looper
looper
)
{
super
(
looper
);
}
@Override
public
void
handleMessage
(
Message
msg
)
{
super
.
handleMessage
(
msg
);
switch
(
msg
.
what
)
{
case
HANDLER_PREPARE:
initVideo
(
msg
);
break
;
case
HANDLER_SETDISPLAY:
showDisplay
(
msg
);
break
;
case
HANDLER_RELEASE:
if
(
mediaPlayer
!=
null
)
{
mediaPlayer
.
release
();
}
break
;
}
}
}
private
void
initVideo
(
Message
msg
)
{
try
{
mediaPlayer
.
release
();
initIJKPlayer
(
msg
);
mediaPlayer
.
setOnPreparedListener
(
GSYPreViewManager
.
this
);
mediaPlayer
.
setVolume
(
0
,
0
);
mediaPlayer
.
prepareAsync
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
private
void
initIJKPlayer
(
Message
msg
)
{
mediaPlayer
=
new
IjkMediaPlayer
();
mediaPlayer
.
setAudioStreamType
(
AudioManager
.
STREAM_MUSIC
);
try
{
mediaPlayer
.
setDataSource
(((
GSYModel
)
msg
.
obj
).
getUrl
(),
((
GSYModel
)
msg
.
obj
).
getMapHeadData
());
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
private
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
onPrepared
(
IMediaPlayer
mp
)
{
mp
.
pause
();
}
public
void
prepare
(
final
String
url
,
final
Map
<
String
,
String
>
mapHeadData
,
boolean
loop
,
float
speed
)
{
if
(
TextUtils
.
isEmpty
(
url
))
return
;
Message
msg
=
new
Message
();
msg
.
what
=
HANDLER_PREPARE
;
GSYModel
fb
=
new
GSYModel
(
url
,
mapHeadData
,
loop
,
speed
);
msg
.
obj
=
fb
;
mMediaHandler
.
sendMessage
(
msg
);
}
public
void
releaseMediaPlayer
()
{
Message
msg
=
new
Message
();
msg
.
what
=
HANDLER_RELEASE
;
mMediaHandler
.
sendMessage
(
msg
);
}
public
void
setDisplay
(
Surface
holder
)
{
Message
msg
=
new
Message
();
msg
.
what
=
HANDLER_SETDISPLAY
;
msg
.
obj
=
holder
;
mMediaHandler
.
sendMessage
(
msg
);
}
public
IjkMediaPlayer
getMediaPlayer
()
{
return
mediaPlayer
;
}
}
\ No newline at end of file
gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/video/CustomGSYVideoPlayer.java
浏览文件 @
a5346727
package
com.shuyu.gsyvideoplayer.video
;
import
android.app.Activity
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.media.MediaMetadataRetriever
;
import
android.text.TextUtils
;
import
android.graphics.SurfaceTexture
;
import
android.os.Handler
;
import
android.util.AttributeSet
;
import
android.widget.ImageView
;
import
android.view.Surface
;
import
android.view.TextureView
;
import
android.view.ViewGroup
;
import
android.widget.RelativeLayout
;
import
android.widget.SeekBar
;
import
com.shuyu.gsyvideoplayer.GSY
Video
Manager
;
import
com.shuyu.gsyvideoplayer.GSY
VideoPlayer
;
import
com.shuyu.gsyvideoplayer.GSY
PreView
Manager
;
import
com.shuyu.gsyvideoplayer.GSY
TextureView
;
import
com.shuyu.gsyvideoplayer.R
;
import
com.shuyu.gsyvideoplayer.utils.Debuger
;
import
java.util.Timer
;
import
java.util.TimerTask
;
import
java.util.UUID
;
/**
* Created by shuyu on 2016/12/10.
*/
public
class
CustomGSYVideoPlayer
extends
StandardGSYVideoPlayer
{
private
RelativeLayout
mPreviewLayout
;
private
ImageView
mSeekBarImage
;
private
ShowSeekBarImageTimerTask
mShowSeekBarImageTimerTask
;
private
Timer
mSeekBarImageTimer
;
//记录上一个进度图的位置,用于判断是否取数据
private
int
mPreSeekPosition
=
-
1
;
//记录进度图变化的帧图片图的偏移时间,避免太频繁进入
private
long
mOffsetTime
;
private
GSYTextureView
mPreviewTexture
;
//是否因为用户点击
private
boolean
mIsFromUser
;
...
...
@@ -53,7 +40,7 @@ public class CustomGSYVideoPlayer extends StandardGSYVideoPlayer {
private
void
initView
()
{
m
SeekBarImage
=
(
ImageView
)
findViewById
(
R
.
id
.
seek_bar_image
);
m
PreviewLayout
=
(
RelativeLayout
)
findViewById
(
R
.
id
.
preview_layout
);
}
@Override
...
...
@@ -61,30 +48,67 @@ public class CustomGSYVideoPlayer extends StandardGSYVideoPlayer {
return
R
.
layout
.
video_layout_custom
;
}
@Override
public
void
onProgressChanged
(
SeekBar
seekBar
,
int
progress
,
boolean
fromUser
)
{
super
.
onProgressChanged
(
seekBar
,
progress
,
fromUser
);
if
((
mCurrentState
==
GSYVideoPlayer
.
CURRENT_STATE_PLAYING
||
mCurrentState
==
GSYVideoPlayer
.
CURRENT_STATE_PAUSE
)
&&
GSYVideoManager
.
instance
().
getMediaPlayer
()
!=
null
)
{
protected
void
addTextureView
()
{
super
.
addTextureView
();
if
(
mPreviewLayout
.
getChildCount
()
>
0
)
{
mPreviewLayout
.
removeAllViews
();
}
mPreviewTexture
=
null
;
mPreviewTexture
=
new
GSYTextureView
(
getContext
());
mPreviewTexture
.
setSurfaceTextureListener
(
new
TextureView
.
SurfaceTextureListener
()
{
@Override
public
void
onSurfaceTextureAvailable
(
SurfaceTexture
surface
,
int
width
,
int
height
)
{
GSYPreViewManager
.
instance
().
setDisplay
(
new
Surface
(
surface
));
}
@Override
public
void
onSurfaceTextureSizeChanged
(
SurfaceTexture
surface
,
int
width
,
int
height
)
{
}
@Override
public
boolean
onSurfaceTextureDestroyed
(
SurfaceTexture
surface
)
{
GSYPreViewManager
.
instance
().
setDisplay
(
null
);
return
true
;
}
@Override
public
void
onSurfaceTextureUpdated
(
SurfaceTexture
surface
)
{
}
});
mPreviewTexture
.
setRotation
(
mRotate
);
RelativeLayout
.
LayoutParams
layoutParams
=
new
RelativeLayout
.
LayoutParams
(
ViewGroup
.
LayoutParams
.
MATCH_PARENT
,
ViewGroup
.
LayoutParams
.
MATCH_PARENT
);
layoutParams
.
addRule
(
RelativeLayout
.
CENTER_IN_PARENT
);
mPreviewLayout
.
addView
(
mPreviewTexture
,
layoutParams
);
}
@Override
protected
void
prepareVideo
()
{
GSYPreViewManager
.
instance
().
prepare
(
mUrl
,
mMapHeadData
,
mLooping
,
mSpeed
);
super
.
prepareVideo
();
}
@Override
public
void
onProgressChanged
(
SeekBar
seekBar
,
final
int
progress
,
boolean
fromUser
)
{
super
.
onProgressChanged
(
seekBar
,
progress
,
fromUser
);
if
(
fromUser
)
{
int
width
=
seekBar
.
getWidth
();
int
offset
=
(
int
)
(
width
-
(
getResources
().
getDimension
(
R
.
dimen
.
seek_bar_image
)
/
2
))
/
100
*
progress
;
RelativeLayout
.
LayoutParams
layoutParams
=
(
RelativeLayout
.
LayoutParams
)
m
SeekBarImage
.
getLayoutParams
();
RelativeLayout
.
LayoutParams
layoutParams
=
(
RelativeLayout
.
LayoutParams
)
m
PreviewLayout
.
getLayoutParams
();
layoutParams
.
leftMargin
=
offset
;
//设置帧预览图的显示位置
mSeekBarImage
.
setLayoutParams
(
layoutParams
);
long
currentTime
=
System
.
currentTimeMillis
();
if
(
fromUser
&&
(
mPreSeekPosition
==
-
1
||
Math
.
abs
(
progress
-
mPreSeekPosition
)
>
2
))
{
//开始预览帧小图
startSeekBarImageTimer
(
seekBar
.
getProgress
());
mPreSeekPosition
=
progress
;
mOffsetTime
=
currentTime
;
mPreviewLayout
.
setLayoutParams
(
layoutParams
);
if
(
GSYPreViewManager
.
instance
().
getMediaPlayer
()
!=
null
&&
mHadPlay
)
{
int
time
=
progress
*
getDuration
()
/
100
;
Debuger
.
printfLog
(
"SEEK TO "
+
time
);
GSYPreViewManager
.
instance
().
getMediaPlayer
().
seekTo
(
time
);
}
}
}
...
...
@@ -92,18 +116,14 @@ public class CustomGSYVideoPlayer extends StandardGSYVideoPlayer {
public
void
onStartTrackingTouch
(
SeekBar
seekBar
)
{
super
.
onStartTrackingTouch
(
seekBar
);
mIsFromUser
=
true
;
m
SeekBarImage
.
setVisibility
(
VISIBLE
);
m
PreviewLayout
.
setVisibility
(
VISIBLE
);
}
@Override
public
void
onStopTrackingTouch
(
SeekBar
seekBar
)
{
seekBar
.
setProgress
(
mPreSeekPosition
);
super
.
onStopTrackingTouch
(
seekBar
);
mIsFromUser
=
false
;
cancelSeekBarImageTimer
();
mSeekBarImage
.
setVisibility
(
GONE
);
mOffsetTime
=
0
;
mPreSeekPosition
=
-
1
;
mPreviewLayout
.
setVisibility
(
GONE
);
}
@Override
...
...
@@ -113,60 +133,4 @@ public class CustomGSYVideoPlayer extends StandardGSYVideoPlayer {
}
super
.
setTextAndProgress
(
secProgress
);
}
private
void
startSeekBarImageTimer
(
int
progress
)
{
cancelSeekBarImageTimer
();
mSeekBarImageTimer
=
new
Timer
();
mShowSeekBarImageTimerTask
=
new
ShowSeekBarImageTimerTask
(
progress
);
mSeekBarImageTimer
.
schedule
(
mShowSeekBarImageTimerTask
,
0
);
}
private
void
cancelSeekBarImageTimer
()
{
if
(
mShowSeekBarImageTimerTask
!=
null
)
{
mShowSeekBarImageTimerTask
.
cancel
();
}
if
(
mSeekBarImageTimer
!=
null
)
{
mSeekBarImageTimer
.
cancel
();
}
}
/**
* 获取帧预览图任务
**/
protected
class
ShowSeekBarImageTimerTask
extends
TimerTask
{
int
mProgress
;
ShowSeekBarImageTimerTask
(
int
progress
)
{
this
.
mProgress
=
progress
;
}
@Override
public
void
run
()
{
if
(!
TextUtils
.
isEmpty
(
mUrl
))
{
try
{
int
time
=
mProgress
*
getDuration
()
/
100
*
1000
;
//获取帧图片
if
(
GSYVideoManager
.
instance
().
getMediaMetadataRetriever
()
!=
null
)
{
final
Bitmap
bitmap
=
GSYVideoManager
.
instance
().
getMediaMetadataRetriever
()
.
getFrameAtTime
(
time
,
MediaMetadataRetriever
.
OPTION_CLOSEST
);
((
Activity
)
getContext
()).
runOnUiThread
(
new
Runnable
()
{
@Override
public
void
run
()
{
if
(
bitmap
!=
null
)
{
Debuger
.
printfLog
(
"time "
+
System
.
currentTimeMillis
());
//显示
mSeekBarImage
.
setImageBitmap
(
bitmap
);
}
}
});
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
}
}
}
gsyVideoPlayer/src/main/res/layout/video_layout_custom.xml
浏览文件 @
a5346727
...
...
@@ -166,8 +166,8 @@
</LinearLayout>
<
ImageView
android:id=
"@+id/
seek_bar_image
"
<
RelativeLayout
android:id=
"@+id/
preview_layout
"
android:layout_width=
"@dimen/seek_bar_image"
android:layout_height=
"100dp"
android:layout_above=
"@+id/layout_bottom"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录