【问题标题】:Android ExoPlayer Listener Infinite loopAndroid ExoPlayer 监听器无限循环
【发布时间】:2016-08-16 02:46:07
【问题描述】:

我想将 ExoPlayer 与 SurfaceView 和 SeekBar 一起使用。我从 ExoPlayer Demo 中获取的 buildTrackName 函数。我想使用 SeekBar 来更改播放器的位置,并使用 listView 来显示我的视频的所有音轨。当我使用 ExoPlayer 函数获取播放器持续时间或从视频中获取所有音轨时,这些函数为 getDuration() 返回 -1,为 getTrackCount() 返回 0。我试图将这些函数放在代码的不同部分,但它们只在 ExoPlayer.Listener 的 onPlayerStateChanged 方法中起作用。但!在这种情况下,执行完所有函数后,程序进入无限循环。

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

    }
});

}

///
}

【问题讨论】:

    标签: android loops listener infinite-loop exoplayer


    【解决方案1】:

    ExoPlayer 2 brigns 支持使用LoopingMediaSource 无缝循环播放视频

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      相关资源
      最近更新 更多