2016-04-22 9 views
1

Ich möchte ExoPlayer mit SurfaceView und SeekBar verwenden. buildTrackName Funktion, die ich von ExoPlayer Demo genommen habe. Ich möchte SeekBar verwenden, um die Position des Players und listView zu ändern, um die gesamte Audiospur meines Videos anzuzeigen. Wenn ich ExoPlayer-Funktionen verwende, um die Player-Dauer zu erhalten oder alle Audio-Tracks vom Video zu erhalten, geben diese Funktionen -1 für getDuration() und 0 für getTrackCount() zurück. Ich habe versucht, diese Funktionen in verschiedenen Teilen des Codes zu verwenden, aber sie funktionieren nur in der onPlayerStateChanged-Methode von ExoPlayer.Listener. Aber! In diesem Fall geht das Programm nach allen Funktionen in eine Endlosschleife über.Android ExoPlayer Listener Endlosschleife

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{ 

private String videoPath = "myVideoPath"; 
private SurfaceView surfaceView; 
private SeekBar seekBar; 
private ListView listView; 
private ArrayList<String> trackList; 
private ArrayAdapter<String> arrayAdapter; 
private ExoPlayer exoPlayer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 

surfaceView = (SurfaceView) findViewById(R.id.surfaceView); 
seekBar = (SeekBar) findViewById(R.id.seekBar); 
listView = (ListView) findViewById(R.id.listView); 

trackList = new ArrayList<>(); 
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, audioList); 
listView.setAdapter(arrayAdapter); 

MediaCodecSelector mediaCodecSelector = MediaCodecSelector.DEFAULT; 

Uri uri = Uri.parse(videoPath); 
DataSource dataSource = new DefaultUriDataSource(this, "test"); 
ExtractorSampleSource extractorSampleSource = new ExtractorSampleSource(
     uri, dataSource, new DefaultAllocator(64*1024), 256*64*1024,null); 
MediaCodecVideoTrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer(this,extractorSampleSource,mediaCodecSelector,MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT); 
MediaCodecAudioTrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(
     extractorSampleSource, mediaCodecSelector); 

exoPlayer = ExoPlayer.Factory.newInstance(2); 

exoPlayer.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, surfaceView.getHolder().getSurface()); 

exoPlayer.prepare(videoRenderer,audioRenderer); 

exoPlayer.setPlayWhenReady(true); 

exoPlayer.addListener(new ExoPlayer.Listener() { 
    @Override 
    public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { 
     if (playbackState == ExoPlayer.STATE_READY){ 
      seekBar.setMax((int)exoPlayer.getDuration());   
      int trackCount = exoPlayer.getTrackCount(1); 
      for (int i = 0; i < trackCount; i++) { 
       trackList.add(buildTrackName(exoPlayer.getTrackFormat(1, i))); 
      } 
     } //infinite loop after this place 
    } 

    @Override 
    public void onPlayWhenReadyCommitted() { 

    } 

    @Override 
    public void onPlayerError(ExoPlaybackException error) { 

    } 
}); 

} 

/// 
} 

Antwort