google / ExoPlayer

An extensible media player for Android
Apache License 2.0
21.62k stars 6k forks source link

duration and position(need help) #2560

Closed shoyu666 closed 7 years ago

shoyu666 commented 7 years ago

dear author: i use com.google.android.exoplayer:exoplayer:r2.2.0 play mp4 url source but meet a proplem

       at  PlaybackControlView.java updateProgress()
       long duration = player == null ? 0 : player.getDuration();
        long position = player == null ? 0 : player.getCurrentPosition();

       when vedio is reach end
       1 same times  position >duration ,and postion can not stop grow up ;updateProgress not stop call
       2 same times  position  <duration ,and postion Stable ;updateProgress not stop call

i use PlaybackControlView only with out SimpleExoPlayerView we only care about audio in mp4

we want play mp4 A ,when A end , auto play mp4 B but position always <duration and STATE_ENDED never rev (onPlayerStateChanged)

 TrackSelection.Factory videoTrackSelectionFactory =
                new AdaptiveVideoTrackSelection.Factory(BANDWIDTH_METER);
        DefaultTrackSelector trackSelector =
                new DefaultTrackSelector(videoTrackSelectionFactory);
        LoadControl loadControl = new DefaultLoadControl();
        SimpleExoPlayer play = ExoPlayerFactory.newSimpleInstance(context, trackSelector, loadControl);
        ExoPlayerEventLogger eventLogger = new ExoPlayerEventLogger(trackSelector);
        play.addListener(eventLogger);
        SimpleExoPlayerWrap wrap = new SimpleExoPlayerWrap();
        wrap.mSimpleExoPlayer = play;
for (int i = 0; i < uris.length; i++) {
            mediaSources[i] =  ExoPlayUtil.buildMediaSource(uris[i],null,mediaDataSourceFactory,mainHandler,eventLogger);
        }
        MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0]
                : new ConcatenatingMediaSource(mediaSources);
        boolean haveResumePosition = resumeWindow != C.INDEX_UNSET;
        if (haveResumePosition) {
            mSimpleExoPlayer.seekTo(resumeWindow, resumePosition);
        }
        mSimpleExoPlayer.prepare(mediaSource, !haveResumePosition, false);
public class ExoPlayUtil {

    public static final DefaultBandwidthMeter BANDWIDTH_METER = new DefaultBandwidthMeter();

    public static MediaSource buildMediaSource(Uri uri, String overrideExtension, DataSource.Factory mediaDataSourceFactory, Handler mainHandler, ExoPlayerEventLogger eventLogger) {
        int type = Util.inferContentType(!TextUtils.isEmpty(overrideExtension) ? "." + overrideExtension
                : uri.getLastPathSegment());
        switch (type) {
            case C.TYPE_SS:
                return new SsMediaSource(uri, buildDataSourceFactory(false),
                        new DefaultSsChunkSource.Factory(mediaDataSourceFactory), mainHandler, eventLogger);
            case C.TYPE_DASH:
                return new DashMediaSource(uri, buildDataSourceFactory(false),
                        new DefaultDashChunkSource.Factory(mediaDataSourceFactory), mainHandler, eventLogger);
            case C.TYPE_HLS:
                return new HlsMediaSource(uri, mediaDataSourceFactory, mainHandler, eventLogger);
            case C.TYPE_OTHER:
                return new ExtractorMediaSource(uri, mediaDataSourceFactory, new DefaultExtractorsFactory(),
                        mainHandler, eventLogger);
            default: {
                throw new IllegalStateException("Unsupported type: " + type);
            }
        }
    }
ojw28 commented 7 years ago

It's unclear what the problem being described is. Please provide clear reproduction steps (ideally using the demo app or a minimal modification of it).

shoyu666 commented 7 years ago

thank for reply i use demo find same problem

step 1
change  json
"name": "Playlists",
    "samples": [
      {
        "name": "Cats -> Dogs",
        "playlist": [
          {
            "uri": "http://1253365662.vod2.myqcloud.com/2bd5f4a6vodgzp1253365662/82a51d919031868222882862818/f0.mp4"
          },
          {
            "uri": "http://1253365662.vod2.myqcloud.com/2bd5f4a6vodgzp1253365662/82a5a1709031868222882863618/f0.mp4"
          }
        ]
      },
step 2
  <com.google.android.exoplayer2.ui.SimpleExoPlayerView android:id="@+id/player_view"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>
to
 <com.google.android.exoplayer2.ui.PlaybackControlView android:id="@+id/player_view"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

//  simpleExoPlayerView before SimpleExoPlayerView  now is PlaybackControlView
    simpleExoPlayerView = (PlaybackControlView) findViewById(R.id.player_view);
//    simpleExoPlayerView.setControllerVisibilityListener(this);  remove it
    simpleExoPlayerView.requestFocus();
    simpleExoPlayerView.show();   add show

  @Override
  public boolean dispatchKeyEvent(KeyEvent event) {
    // Show the controls on any key event.
//    simpleExoPlayerView.showController();  remove it 
    // If the event was not handled then see if the player view can handle it as a media key event.
    return super.dispatchKeyEvent(event) || simpleExoPlayerView.dispatchMediaKeyEvent(event);
  }
step 3
add log
PlaybackControlView#updateProgress 
 long duration = player == null ? 0 : player.getDuration();
    long position = player == null ? 0 : player.getCurrentPosition();
    android.util.Log.d("updateProgress","duration "+duration+" position "+position);   add log
    if (durationView != null) {
      durationView.setText(stringForTime(duration));
    }
android.util.Log.d("updateProgress","duration "+duration+" position "+position);   log
03-16 09:17:44.875 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration -9223372036854775807 position 0
03-16 09:17:44.960 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 0
03-16 09:17:45.029 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 0
03-16 09:17:45.182 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 28
03-16 09:17:46.155 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 929
03-16 09:17:47.227 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 2005
03-16 09:17:48.143 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 2919
03-16 09:17:49.146 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 2937
03-16 09:17:50.148 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 2937
03-16 09:17:51.148 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 2937
03-16 09:17:52.151 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 2937
03-16 09:17:53.153 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 2937
03-16 09:17:54.154 12004-12004/com.google.android.exoplayer2.demo D/updateProgress: duration 3125 position 2937

more....  duration 3125 position 2937

position always < duration ?
EventLogger 
03-16 09:18:28.118 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: videoDisabled [11.34]
03-16 09:18:28.118 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: audioDisabled [11.34]
03-16 09:18:29.527 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: state [0.00, true, I]
03-16 09:18:29.546 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: state [0.02, true, B]
03-16 09:18:29.546 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: sourceInfo [periodCount=2, windowCount=2
03-16 09:18:29.546 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   period [?]
03-16 09:18:29.546 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   period [?]
03-16 09:18:29.546 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   window [?, false, false]
03-16 09:18:29.546 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   window [?, false, false]
03-16 09:18:29.546 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: ]
03-16 09:18:29.546 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: loading [true]
03-16 09:18:29.562 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: sourceInfo [periodCount=2, windowCount=2
03-16 09:18:29.563 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   period [3.12]
03-16 09:18:29.563 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   period [?]
03-16 09:18:29.563 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   window [3.12, true, false]
03-16 09:18:29.563 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   window [?, false, false]
03-16 09:18:29.563 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: ]
03-16 09:18:29.565 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: Tracks [
03-16 09:18:29.565 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   Renderer:0 [
03-16 09:18:29.565 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:     Group:0, adaptive_supported=N/A [
03-16 09:18:29.565 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:       [X] Track:0, id=1, mimeType=video/avc, res=176x144, supported=YES
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:     ]
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   ]
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   Renderer:1 [
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:     Group:0, adaptive_supported=N/A [
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:       [X] Track:0, id=2, mimeType=audio/mp4a-latm, channels=2, sample_rate=48000, language=und, supported=YES
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:     ]
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:     Metadata [
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:       TSSE: value=Lavf56.40.101
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:     ]
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   ]
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: ]
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: videoEnabled [0.04]
03-16 09:18:29.566 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: audioEnabled [0.04]
03-16 09:18:29.574 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: videoFormatChanged [0.05, id=1, mimeType=video/avc, res=176x144]
03-16 09:18:29.592 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: audioDecoderInitialized [0.06, OMX.google.aac.decoder]
03-16 09:18:29.592 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: audioFormatChanged [0.06, id=2, mimeType=audio/mp4a-latm, channels=2, sample_rate=48000, language=und]
03-16 09:18:29.593 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: state [0.07, true, R]
03-16 09:18:29.604 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: audioSessionId [5376]
03-16 09:18:29.696 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: sourceInfo [periodCount=2, windowCount=2
03-16 09:18:29.697 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   period [3.12]
03-16 09:18:29.697 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   period [73.00]
03-16 09:18:29.697 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   window [3.12, true, false]
03-16 09:18:29.697 12004-12004/com.google.android.exoplayer2.demo D/EventLogger:   window [73.00, true, false]
03-16 09:18:29.697 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: ]
03-16 09:18:29.815 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: loading [false]
03-16 09:18:32.643 12004-12004/com.google.android.exoplayer2.demo D/EventLogger: state [3.12, true, B]

E is End?  but never E
shoyu666 commented 7 years ago

i find mp4 1 play end and mp4 2 will play auto ( i use demo with out modify) mp4 1 play end but mp4 2 will not play auto ( i use demo with modify)

andrewlewis commented 7 years ago

These MP4s have video streams but there is no surface to render to, as unlike the demo app you're not using a SimpleExoPlayerView. If you have control over what files you're playing, I think the best fix is to remove the video streams so that the source MP4s only have audio. Alternative options include disabling the video renderer (e.g. trackSelector.setRendererDisabled(0, true)), or subclassing SimpleExoPlayer and overriding buildVideoRenderers to do nothing.

shoyu666 commented 7 years ago

@andrewlewis thanks for you reply subclassing SimpleExoPlayer and overriding buildVideoRenderers to do nothing it work for me thanks