Изменить медиаресурс перед игрой Exoplayer в MergingMediaSource - PullRequest
0 голосов
/ 29 апреля 2020

Я играю одновременно одно видео с несколькими звуками в 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);

Мои коды работают хорошо, но перед воспроизведением видео покажите черный экран и затем воспроизведите видео и я думаю, что это неправильно. Пожалуйста, помогите мне решить эту проблему. Спасибо

...