Skip to content

Commit ca90af4

Browse files
author
jiajunhui
committed
修复起搏点在特殊场景下失效问题,升级exo版本
1 parent e94c735 commit ca90af4

File tree

6 files changed

+98
-64
lines changed

6 files changed

+98
-64
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,18 +82,18 @@ demo示例集成了播放控制组件**ControllerCover**、加载中组件**Load
8282
dependencies {
8383
//---------如果仅使用MediaPlayer解码,使用以下依赖。----------
8484
//该依赖仅包含MediaPlayer解码
85-
implementation 'com.kk.taurus.playerbase:playerbase:3.3.9'
85+
implementation 'com.kk.taurus.playerbase:playerbase:3.4.0'
8686
8787
8888
//---------如果使用ExoPlayer解码,使用以下依赖。---------
8989
//该依赖包含exoplayer解码和MediaPlayer解码
9090
//注意exoplayer的最小支持SDK版本为16
91-
implementation 'cn.jiajunhui:exoplayer:339_2118_015'
91+
implementation 'cn.jiajunhui:exoplayer:340_2120_016'
9292
9393
9494
//---------如果使用ijkPlayer解码,使用以下依赖。---------
9595
//该依赖包含ijkplayer解码和MediaPlayer解码
96-
implementation 'cn.jiajunhui:ijkplayer:339_088_010'
96+
implementation 'cn.jiajunhui:ijkplayer:340_088_011'
9797
//ijk官方的解码库依赖,较少格式版本且不支持HTTPS。
9898
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
9999
# Other ABIs: optional

build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ project.ext {
3737
lib = [
3838
//module versions
3939
ijksdkVersion = '0.8.8',
40-
exoplayersdkVersion = '2.11.8',
40+
exoplayersdkVersion = '2.12.0',
4141
appcompatVersion = '1.2.0',
4242

43-
playerbaseIjkVersion = '339_088_010',
44-
playerbaseExoVersion = '339_2118_015',
45-
playerbaseVersion = '3.3.9'
43+
playerbaseIjkVersion = '340_088_011',
44+
playerbaseExoVersion = '340_2120_016',
45+
playerbaseVersion = '3.4.0'
4646
]
4747

4848
}

exoplayer/src/main/java/com/kk/taurus/exoplayer/ExoMediaPlayer.java

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.google.android.exoplayer2.DefaultRenderersFactory;
2828
import com.google.android.exoplayer2.ExoPlaybackException;
2929
import com.google.android.exoplayer2.Format;
30+
import com.google.android.exoplayer2.MediaItem;
3031
import com.google.android.exoplayer2.PlaybackParameters;
3132
import com.google.android.exoplayer2.Player;
3233
import com.google.android.exoplayer2.RenderersFactory;
@@ -48,6 +49,7 @@
4849
import com.google.android.exoplayer2.upstream.DefaultHttpDataSource;
4950
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
5051
import com.google.android.exoplayer2.upstream.RawResourceDataSource;
52+
import com.google.android.exoplayer2.util.MimeTypes;
5153
import com.google.android.exoplayer2.util.Util;
5254
import com.google.android.exoplayer2.video.VideoListener;
5355
import com.kk.taurus.playerbase.config.AppContextAttach;
@@ -66,6 +68,8 @@
6668

6769
import java.util.HashMap;
6870

71+
import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
72+
6973
public class ExoMediaPlayer extends BaseInternalPlayer {
7074

7175
private final String TAG = "ExoMediaPlayer";
@@ -181,15 +185,17 @@ public void setDataSource(DataSource dataSource) {
181185
//handle timed text source
182186
TimedTextSource timedTextSource = dataSource.getTimedTextSource();
183187
if(timedTextSource!=null){
184-
Format format = Format.createTextSampleFormat(null, timedTextSource.getMimeType(), timedTextSource.getFlag(), null);
188+
Format format = new Format.Builder().setSampleMimeType(timedTextSource.getMimeType()).setSelectionFlags(timedTextSource.getFlag()).build();
185189
MediaSource timedTextMediaSource = new SingleSampleMediaSource.Factory(new DefaultDataSourceFactory(mAppContext,
186-
userAgent))
187-
.createMediaSource(Uri.parse(timedTextSource.getPath()), format, C.TIME_UNSET);
190+
userAgent)).createMediaSource(new MediaItem.Subtitle(
191+
Uri.parse(timedTextSource.getPath()),
192+
checkNotNull(format.sampleMimeType), format.language, format.selectionFlags), C.TIME_UNSET);
188193
//merge MediaSource and timedTextMediaSource.
189194
mediaSource = new MergingMediaSource(mediaSource, timedTextMediaSource);
190195
}
191196

192-
mInternalPlayer.prepare(mediaSource);
197+
mInternalPlayer.setMediaSource(mediaSource);
198+
mInternalPlayer.prepare();
193199
mInternalPlayer.setPlayWhenReady(false);
194200

195201
Bundle sourceBundle = BundlePool.obtain();
@@ -200,17 +206,21 @@ public void setDataSource(DataSource dataSource) {
200206

201207
private MediaSource getMediaSource(Uri uri, com.google.android.exoplayer2.upstream.DataSource.Factory dataSourceFactory){
202208
int contentType = Util.inferContentType(uri);
209+
MediaItem mediaItem = new MediaItem.Builder()
210+
.setUri(uri)
211+
.setMimeType(MimeTypes.APPLICATION_MPD)
212+
.build();
203213
switch (contentType) {
204214
case C.TYPE_DASH:
205-
return new DashMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
215+
return new DashMediaSource.Factory(dataSourceFactory).createMediaSource(mediaItem);
206216
case C.TYPE_SS:
207-
return new SsMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
217+
return new SsMediaSource.Factory(dataSourceFactory).createMediaSource(mediaItem);
208218
case C.TYPE_HLS:
209-
return new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
219+
return new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(mediaItem);
210220
case C.TYPE_OTHER:
211221
default:
212222
// This is the MediaSource representing the media to be played.
213-
return new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
223+
return new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(mediaItem);
214224
}
215225
}
216226

@@ -290,8 +300,13 @@ public void start() {
290300

291301
@Override
292302
public void start(int msc) {
293-
mStartPos = msc;
294-
start();
303+
if(getState() == STATE_PREPARED && msc > 0){
304+
start();
305+
seekTo(msc);
306+
}else{
307+
mStartPos = msc;
308+
start();
309+
}
295310
}
296311

297312
@Override
@@ -387,7 +402,7 @@ public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray tra
387402
}
388403

389404
@Override
390-
public void onLoadingChanged(boolean isLoading) {
405+
public void onIsLoadingChanged(boolean isLoading) {
391406
int bufferPercentage = mInternalPlayer.getBufferedPercentage();
392407
if(!isLoading){
393408
submitBufferingUpdate(bufferPercentage, null);
@@ -396,25 +411,8 @@ public void onLoadingChanged(boolean isLoading) {
396411
}
397412

398413
@Override
399-
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
400-
PLog.d(TAG,"onPlayerStateChanged : playWhenReady = "+ playWhenReady
401-
+ ", playbackState = " + playbackState);
402-
403-
if(!isPreparing){
404-
if(playWhenReady){
405-
if(getState()==STATE_PREPARED){
406-
updateStatus(IPlayer.STATE_STARTED);
407-
submitPlayerEvent(OnPlayerEventListener.PLAYER_EVENT_ON_AUDIO_RENDER_START, null);
408-
}else{
409-
updateStatus(IPlayer.STATE_STARTED);
410-
submitPlayerEvent(OnPlayerEventListener.PLAYER_EVENT_ON_RESUME, null);
411-
}
412-
}else{
413-
updateStatus(IPlayer.STATE_PAUSED);
414-
submitPlayerEvent(OnPlayerEventListener.PLAYER_EVENT_ON_PAUSE, null);
415-
}
416-
}
417-
414+
public void onPlaybackStateChanged(int playbackState) {
415+
PLog.d(TAG,"onPlayerStateChanged : playbackState = " + playbackState);
418416
if(isPreparing){
419417
switch (playbackState){
420418
case Player.STATE_READY:
@@ -428,19 +426,13 @@ public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
428426
updateStatus(IPlayer.STATE_PREPARED);
429427
submitPlayerEvent(OnPlayerEventListener.PLAYER_EVENT_ON_PREPARED, bundle);
430428

431-
if(playWhenReady){
432-
updateStatus(STATE_STARTED);
433-
submitPlayerEvent(OnPlayerEventListener.PLAYER_EVENT_ON_AUDIO_RENDER_START, null);
434-
}
435-
436429
if(mStartPos > 0 && mInternalPlayer.getDuration() > 0){
437430
mInternalPlayer.seekTo(mStartPos);
438431
mStartPos = -1;
439432
}
440433
break;
441434
}
442435
}
443-
444436
if(isBuffering){
445437
switch (playbackState){
446438
case Player.STATE_READY:
@@ -480,7 +472,25 @@ public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
480472
break;
481473
}
482474
}
475+
}
483476

477+
@Override
478+
public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) {
479+
PLog.d(TAG,"onPlayerStateChanged : playWhenReady = "+ playWhenReady + ", reason = " + reason);
480+
if(!isPreparing){
481+
if(playWhenReady){
482+
if(getState()==STATE_PREPARED){
483+
updateStatus(IPlayer.STATE_STARTED);
484+
submitPlayerEvent(OnPlayerEventListener.PLAYER_EVENT_ON_AUDIO_RENDER_START, null);
485+
}else{
486+
updateStatus(IPlayer.STATE_STARTED);
487+
submitPlayerEvent(OnPlayerEventListener.PLAYER_EVENT_ON_RESUME, null);
488+
}
489+
}else{
490+
updateStatus(IPlayer.STATE_PAUSED);
491+
submitPlayerEvent(OnPlayerEventListener.PLAYER_EVENT_ON_PAUSE, null);
492+
}
493+
}
484494
}
485495

486496
@Override

ijkplayer/src/main/java/com/kk/taurus/ijkplayer/IjkPlayer.java

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.os.Bundle;
99
import android.text.TextUtils;
1010
import android.util.Log;
11+
import android.util.SparseArray;
1112
import android.view.Surface;
1213
import android.view.SurfaceHolder;
1314

@@ -40,10 +41,12 @@ public class IjkPlayer extends BaseInternalPlayer {
4041

4142
private IjkMediaPlayer mMediaPlayer;
4243

43-
private int mTargetState;
44+
private int mTargetState = Integer.MAX_VALUE;
4445

4546
private int startSeekPos;
4647

48+
private SparseArray<Bundle> mOptionArrays;
49+
4750
public static void init(Context context){
4851
PlayerConfig.addDecoderPlan(new DecoderPlan(
4952
PLAN_ID,
@@ -55,7 +58,8 @@ public static void init(Context context){
5558

5659
public IjkPlayer() {
5760
// init player
58-
mMediaPlayer = createPlayer();
61+
mMediaPlayer = new IjkMediaPlayer();
62+
mOptionArrays = new SparseArray<>();
5963
}
6064

6165
static {
@@ -74,17 +78,21 @@ public IjkPlayer() {
7478
public void option(int code, Bundle bundle) {
7579
super.option(code, bundle);
7680
if(bundle!=null){
77-
Set<String> keySet = bundle.keySet();
78-
for(String key : keySet){
79-
mMediaPlayer.setOption(code, key, bundle.getLong(key));
80-
}
81+
fillOption(code, bundle);
82+
mOptionArrays.put(code, bundle);
8183
}
8284
}
8385

84-
protected IjkMediaPlayer createPlayer(){
85-
IjkMediaPlayer ijkMediaPlayer = new IjkMediaPlayer();
86-
// ijkMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_DEBUG);
86+
private void fillOption(int code, Bundle bundle) {
87+
Set<String> keySet = bundle.keySet();
88+
for(String key : keySet){
89+
mMediaPlayer.setOption(code, key, bundle.getLong(key));
90+
}
91+
}
8792

93+
private void setOptions(IjkMediaPlayer ijkMediaPlayer) {
94+
if(ijkMediaPlayer==null)
95+
return;
8896
//设置清除dns cache
8997
//IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1
9098

@@ -106,7 +114,10 @@ protected IjkMediaPlayer createPlayer(){
106114
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);
107115

108116
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
109-
return ijkMediaPlayer;
117+
int size = mOptionArrays.size();
118+
for(int i=0;i<size;i++){
119+
fillOption(mOptionArrays.keyAt(i), mOptionArrays.valueAt(i));
120+
}
110121
}
111122

112123
@Override
@@ -125,6 +136,8 @@ private void openVideo(DataSource dataSource) {
125136
reset();
126137
resetListener();
127138
}
139+
mTargetState = Integer.MAX_VALUE;
140+
setOptions(mMediaPlayer);
128141
// REMOVED: mAudioSession
129142
mMediaPlayer.setOnPreparedListener(mPreparedListener);
130143
mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
@@ -205,11 +218,16 @@ public void start() {
205218

206219
@Override
207220
public void start(int msc){
208-
if(msc > 0){
209-
startSeekPos = msc;
210-
}
211-
if(available()){
221+
if(getState()==STATE_PREPARED && msc > 0){
212222
start();
223+
mMediaPlayer.seekTo(msc);
224+
}else{
225+
if(msc > 0){
226+
startSeekPos = msc;
227+
}
228+
if(available()){
229+
start();
230+
}
213231
}
214232
}
215233

playerbase/src/main/java/com/kk/taurus/playerbase/AVPlayer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,6 @@ private void onTimerUpdateEvent(int curr, int duration, int bufferPercentage) {
230230
new OnPlayerEventListener() {
231231
@Override
232232
public void onPlayerEvent(int eventCode, Bundle bundle) {
233-
DebugLog.onPlayEventLog(eventCode, bundle);
234233
mTimerCounterProxy.proxyPlayEvent(eventCode, bundle);
235234
if(eventCode==OnPlayerEventListener.PLAYER_EVENT_ON_PREPARED){
236235
//when prepared set volume value
@@ -255,7 +254,6 @@ public void onPlayerEvent(int eventCode, Bundle bundle) {
255254
new OnErrorEventListener() {
256255
@Override
257256
public void onErrorEvent(int eventCode, Bundle bundle) {
258-
DebugLog.onErrorEventLog(eventCode, bundle);
259257
mTimerCounterProxy.proxyErrorEvent(eventCode, bundle);
260258
if(isPlayRecordOpen())
261259
mRecordProxyPlayer.onErrorEvent(eventCode, bundle);
@@ -274,12 +272,14 @@ public void onBufferingUpdate(int bufferPercentage, Bundle extra) {
274272

275273
//must last callback event listener , because bundle will be recycle after callback.
276274
private void callBackPlayEventListener(int eventCode, Bundle bundle) {
275+
DebugLog.onPlayEventLog(eventCode, bundle);
277276
if(mOnPlayerEventListener!=null)
278277
mOnPlayerEventListener.onPlayerEvent(eventCode, bundle);
279278
}
280279

281280
//must last callback event listener , because bundle will be recycle after callback.
282281
private void callBackErrorEventListener(int eventCode, Bundle bundle){
282+
DebugLog.onErrorEventLog(eventCode, bundle);
283283
if(mOnErrorEventListener!=null)
284284
mOnErrorEventListener.onErrorEvent(eventCode, bundle);
285285
}

playerbase/src/main/java/com/kk/taurus/playerbase/player/SysMediaPlayer.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public class SysMediaPlayer extends BaseInternalPlayer {
5151

5252
private MediaPlayer mMediaPlayer;
5353

54-
private int mTargetState;
54+
private int mTargetState = Integer.MAX_VALUE;
5555

5656
private long mBandWidth;
5757

@@ -75,6 +75,7 @@ public void setDataSource(DataSource dataSource) {
7575
reset();
7676
resetListener();
7777
}
78+
mTargetState = Integer.MAX_VALUE;
7879
// REMOVED: mAudioSession
7980
mMediaPlayer.setOnPreparedListener(mPreparedListener);
8081
mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
@@ -277,11 +278,16 @@ public void start() {
277278

278279
@Override
279280
public void start(int msc) {
280-
if(available()){
281-
if(msc > 0){
282-
startSeekPos = msc;
283-
}
281+
if(getState()==STATE_PREPARED && msc > 0){
284282
start();
283+
mMediaPlayer.seekTo(msc);
284+
}else{
285+
if(available()){
286+
if(msc > 0){
287+
startSeekPos = msc;
288+
}
289+
start();
290+
}
285291
}
286292
}
287293

0 commit comments

Comments
 (0)