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

标签 android media-player soundpool exoplayer2.x

我的问题:我想在我的应用程序中加载 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

请帮我解决声音加载和循环间隙问题。

最佳答案

是的,你必须创建多个(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 个实例 if MyAppExoPlayer 并调用 startPlaying()

关于android - 通过 ExoPlayer 或其他选项播放多个音频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56990443/

相关文章:

android - 保存视频前的ffmpeg实时预览

android - Cordova Android 应用程序在某些设备上无法访问互联网

android - 在 android 中,如何在播放时将 RTSP 流保存到文件?

android - 如何流式传输彩信 ://

android - 如何在没有任何延迟的情况下在android中循环播放音频文件?

java - 如何使用 SoundPool 播放随机声音?

java - fragment 上的按钮返回空值指针并使应用程序崩溃

java - Sqlite使用ListView插入数据

iphone - 使用 AVPlayer 在 iPhone 上播放许多不同的视频

java - 安卓游戏,播放 "Game Over"音效