通过ExoPlayer或其他选项播放多个音频文件



我的问题:我想在我的应用程序中加载 70 个声音,然后想播放多个声音(一次最多 8 个声音(。示例应用如下:https://play.google.com/store/apps/details?id=net.relaxio.sleepo

我在我的应用程序中尝试了 SoundPool 系统,它在加载时给我带来了问题。加载 60 个文件大约需要 60 秒以上。所以这个选项对我的应用程序不好。然后我尝试媒体播放器。媒体播放器可以加载,但会给出另一个问题。当我在媒体播放器中设置循环时,它会在重新启动之间产生间隙。然后我找到了一个一次播放多个声音的 github 项目,而且加载速度也很快,但我仍然对这个项目有问题。它无法正确加载超过 30 个声音。在这个项目中,他们使用ExoPlayer(链接如下(。https://github.com/zoenb/Soft-Sound

请帮我做什么,以便解决加载声音和回路间隙问题。

是的,您必须创建多个(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同时播放

 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()

最新更新