1
SurfaceViewとSeekBarでExoPlayerを使いたいです。 buildTrackName関数私はExoPlayerデモから取り出しました。私はSeekBarを使用して、ビデオのオーディオトラックをすべて表示するために、playerの位置を変更したり、listViewを使用したりします。 ExoPlayer関数を使用してプレーヤーの時間を取得するか、ビデオからすべてのオーディオトラックを取得するとき、これらの関数はgetDuration()に対して-1を返し、getTrackCount()に対して0を返します。これらの関数をコードの異なる部分に配置しようとしましたが、ExoPlayer.ListenerのonPlayerStateChangedメソッドでのみ機能します。しかし!この場合、すべての関数の後、プログラムは無限ループに入ります。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) {
}
});
}
///
}