Я играю одновременно одно видео с несколькими звуками в exoplayer, и у меня есть несколько медиа-источников. Сначала все в порядке, но в моем приложении пользователь может приостановить exoplayer и изменить aud ios (Add or Remove) и воспроизвести (Resume) exoplayer. Мой код для первой подготовки exoplayer:
renderersFactory = new DefaultRenderersFactory(this) {
@Override
protected void buildAudioRenderers(Context context, int extensionRendererMode,
MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys, boolean enableDecoderFallback,
AudioProcessor[] audioProcessors, Handler eventHandler,
AudioRendererEventListener eventListener, ArrayList<Renderer> out) {
super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector,
drmSessionManager, playClearSamplesWithoutKeys, enableDecoderFallback,
audioProcessors, eventHandler, eventListener, out);
switch (mediaSource_array.size()){
case 1:
break;
case 2:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
case 3:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
case 4:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
case 5:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
case 6:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
case 7:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
}
}
};
MediaSource[] mediaSources = new MediaSource[mediaSource_array.size()];
for (int i=0; i<mediaSource_array.size(); i++){
mediaSources[i] = buildMediaSource(mediaSource_array.get(i));
}
mediaSource = mediaSources.length == 1 ? mediaSources[0] : new MergingMediaSource(mediaSources);
exoPlayer = new SimpleExoPlayer.Builder(this, renderersFactory)
.setTrackSelector(trackSelector)
.build();
playerView.setPlayer(exoPlayer);
exoPlayer.prepare(mediaSource);
И когда я хочу воспроизвести exoplayer, используйте этот код:
exoPlayer.release();
renderersFactory = null;
mediaSource = null;
renderersFactory = new DefaultRenderersFactory(this) {
@Override
protected void buildAudioRenderers(Context context, int extensionRendererMode,
MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys, boolean enableDecoderFallback,
AudioProcessor[] audioProcessors, Handler eventHandler,
AudioRendererEventListener eventListener, ArrayList<Renderer> out) {
super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector,
drmSessionManager, playClearSamplesWithoutKeys, enableDecoderFallback,
audioProcessors, eventHandler, eventListener, out);
switch (mediaSource_array.size()){
case 1:
break;
case 2:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
case 3:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
case 4:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
case 5:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
case 6:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
case 7:
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
out.add(new AudioRendererWithoutClock(context, mediaCodecSelector));
break;
}
}
};
MediaSource[] mediaSources = new MediaSource[mediaSource_array.size()];
for (int i=0; i<mediaSource_array.size(); i++){
mediaSources[i] = buildMediaSource(mediaSource_array.get(i));
}
mediaSource = mediaSources.length == 1 ? mediaSources[0] : new MergingMediaSource(mediaSources);
exoPlayer = new SimpleExoPlayer.Builder(this, renderersFactory)
.setTrackSelector(trackSelector)
.build();
playerView.setPlayer(exoPlayer);
exoPlayer.prepare(mediaSource);
exoPlayer.setPlayWhenReady(true);
Мои коды работают хорошо, но перед воспроизведением видео покажите черный экран и затем воспроизведите видео и я думаю, что это неправильно. Пожалуйста, помогите мне решить эту проблему. Спасибо