Воспроизвести несколько аудио файлов через ExoPlayer или какой-либо другой вариант? - PullRequest
2 голосов
/ 11 июля 2019

Моя проблема: я хочу загрузить 70 звуков в свое приложение и затем воспроизвести несколько звуков (максимум 8 звуков за раз). Пример приложения ниже: https://play.google.com/store/apps/details?id=net.relaxio.sleepo

Я пробую систему SoundPool в своем приложении, и это вызывает проблемы с загрузкой. SoundPool для загрузки 70 файлов требуется более 60 секунд. Так что этот вариант не подходит для моего приложения. Тогда я попробую MediaPlayer. MediaPlayer в порядке с загрузкой, но дает другую проблему. Когда я устанавливаю зацикливание в медиаплеере, это дает разрыв между перезапуском. Затем я нашел проект GitHub, который воспроизводит несколько звуков одновременно, а также быстрая загрузка, но все же у меня есть проблемы с этим проектом. Он не может загрузить более 30 звуков правильно. В этом проекте они используют ExoPlayer (ссылка ниже). https://github.com/zoenb/Soft-Sound

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

1 Ответ

3 голосов
/ 22 июля 2019

да, вам нужно создать несколько (8) экземпляров exoplayer, вы не можете сделать это с одним экземпляром

вот мой код,

    private void initPlayer() {
      if (player == null) {
        trackSelectorParameters = new DefaultTrackSelector.ParametersBuilder().build();
        TrackSelection.Factory trackSelectionFactory = new AdaptiveTrackSelection.Factory();
        trackSelector = new DefaultTrackSelector(trackSelectionFactory);
        trackSelector.setParameters(trackSelectorParameters);

        RenderersFactory renderersFactory = ((MyAppApplication) context.getApplicationContext()).buildRenderersFactory();

        player = ExoPlayerFactory.newSimpleInstance(context, renderersFactory, trackSelector);

        player.setPlayWhenReady(true);

        //to print log of ExoPlayer
        //player.addAnalyticsListener(new EventLogger(trackSelector));

        progressiveMediaSourceFactory = new ProgressiveMediaSource.Factory(dataSourceFactory);

      }
    }

используйте приведенный выше код дляинициализируйте exoplayer и вызовите этот метод, чтобы добавить все 8 URI s для воспроизведения одновременно

 public void startPlaying(Uri uri) {
        if (player == null) initPlayer();
        MediaSource mediaSource = progressiveMediaSourceFactory.createMediaSource(uri);
        player.prepare(mediaSource, true, false);
  }

вот ссылка на Github - https://github.com/google/ExoPlayer

использование exoplayer-core библиотека

для этого я хотел бы предложить вам создать отдельный класс для ExoPlayer для инициализации, запуска, остановки и тому подобное ...

public class MyAppExoPlayer {

private final Context context;


private DataSource.Factory dataSourceFactory;
private SimpleExoPlayer player;
private DefaultTrackSelector trackSelector;
private DefaultTrackSelector.Parameters trackSelectorParameters;


private ProgressiveMediaSource.Factory progressiveMediaSourceFactory;


private ConcatenatingMediaSource concatenatingMediaSource;
private int currentMediaPlayerIndex = 0;

public MyAppExoPlayer(Context context) {
    this.context = context;

    dataSourceFactory = ((MyAppApplication) context.getApplicationContext()).buildDataSourceFactory();

    initPlayer();
}

private void initPlayer() {
    if (player == null) {
        trackSelectorParameters = new DefaultTrackSelector.ParametersBuilder().build();
        TrackSelection.Factory trackSelectionFactory = new AdaptiveTrackSelection.Factory();
        trackSelector = new DefaultTrackSelector(trackSelectionFactory);
        trackSelector.setParameters(trackSelectorParameters);

        RenderersFactory renderersFactory = ((MyAppApplication) context.getApplicationContext()).buildRenderersFactory();

        player = ExoPlayerFactory.newSimpleInstance(context, renderersFactory, trackSelector);

        player.setPlayWhenReady(true);

        //to print log of ExoPlayer
        //player.addAnalyticsListener(new EventLogger(trackSelector));

        progressiveMediaSourceFactory = new ProgressiveMediaSource.Factory(dataSourceFactory);

    }

    concatenatingMediaSource = new ConcatenatingMediaSource();
}

public void startPlaying(Uri uri) {
    if (player == null) initPlayer();
    MediaSource mediaSource = progressiveMediaSourceFactory.createMediaSource(uri);
    player.prepare(mediaSource, true, false);
}

public void addToQ(Uri uri) {
    if (player == null) return;
    MediaSource mediaSource = progressiveMediaSourceFactory.createMediaSource(uri);
    concatenatingMediaSource.addMediaSource(mediaSource);
}

public void stopPlaying() {
    if (player != null) {
        player.stop(true);
        concatenatingMediaSource.clear();
    }
}

public long getCurrentPosition() {
    if (player != null)
        return player.getCurrentPosition();
    return 0;
}

public void releasePlayer() {
    if (player != null) {

        if (trackSelector != null) {
            trackSelectorParameters = trackSelector.getParameters();
        }

        player.release();
        player = null;
        trackSelector = null;
    }
}
}

Теперь создайте 8 экземпляров, если MyAppExoPlayerи звоните startPlaying()

...