2016-04-22 8 views
1

Я хочу использовать ExoPlayer с SurfaceView и SeekBar. Функция buildTrackName, которую я взял из ExoPlayer Demo. Я хочу использовать SeekBar для изменения позиции игрока и listView для отображения всей звуковой дорожки моего видео. Когда я использую функции ExoPlayer для получения продолжительности проигрывателя или получения всех аудиодорожек из видео, эти функции возвращают -1 для getDuration() и 0 для getTrackCount(). Я попытался поместить эти функции в разные части кода, но они работают только в onPlayerStateChanged методе ExoPlayer.Listener. Но! в этом случае после всех функций программа переходит в бесконечный цикл.Android ExoPlayer Listener Бесконечный цикл

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) { 

    } 
}); 

} 

/// 
} 

ответ

Смежные вопросы