簡體   English   中英

通過ExoPlayer或其他一些選項播放多個音頻文件?

[英]Play Multiple audio files through ExoPlayer or some other option?

我的問題:我想在應用中加載70種聲音,然后播放多種聲音(一次最多8種聲音)。 示例應用程序如下: https : //play.google.com/store/apps/details?id=net.relaxio.sleepo

我在我的應用程序中嘗試了SoundPool系統,這在加載時給我帶來了問題。 SoundPool加載70個文件大約需要60秒鍾以上。 因此,此選項對我的應用程序不利。 然后,我嘗試MediaPlayer。 MediaPlayer可以加載,但是會帶來另一個問題。 當我在mediaplayer中設置循環時,它會在重啟之間留出間隔。 然后我發現了一個github項目,一次可以播放多種聲音,而且加載速度很快,但是這個項目仍然有問題。 無法正確加載30多個聲音。 在這個項目中,他們使用ExoPlayer(下面是鏈接)。 https://github.com/zoenb/Soft-Sound

請幫助我,我該怎么辦才能解決聲音和環路間隙問題。

是的,您必須創建exoplayer的多個(8)實例,而不能用一個實例來做

這是我的代碼,

    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

 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;
    }
}
}

現在如果MyAppExoPlayer創建8個實例並調用startPlaying()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM