Jetpack Media3 воспроизведение аудиопотока из сети

есть приложение написанное несколько лет назад используя com.google.android.exoplayer:exoplayer:2.11.1 хочу переписать его с использованием Jetpack Media3. Есть ли реальный пример написанный на Java, который можно посмотреть и понять как это работает? В документации тоже смотрела, но там нет примера где это демонстрируется.

Хотелось бы разобрать пример и понять что как.

Приложу код, который работает на exoplayer:2.11.1. Если подскажете как его переделать или ссылку на пример буду благодарна. Спасибо.

public class AudioPlayer {

    private static SimpleExoPlayer player;
    public static PlayerView playerView;
    public static int MIN_BUFFER_SIZE = 15000;

    public static void startPlayer(String path, String audioSource, Context context) {

        if (audioSource.equals(AppConstants.audioSourceInternet)) { //Если источник онлайн
            if (player != null) {
                player.stop();
            }

            Uri streamUri = Uri.parse(path);

            SharedPreferences preferencesBufferSize = PreferenceManager.getDefaultSharedPreferences(context);
            String bufferSizeStr = preferencesBufferSize.getString("player_buffer_size", "15");
            int bufferSize = Integer.parseInt(bufferSizeStr);
            MIN_BUFFER_SIZE = bufferSize * 1000;

            System.out.println(MIN_BUFFER_SIZE + " MIN_BUFFER_SIZE");

            //Для измененения размера буфера
            DefaultLoadControl loadControl = new DefaultLoadControl.Builder()
                    .setBufferDurationsMs(MIN_BUFFER_SIZE,
                            DefaultLoadControl.DEFAULT_MAX_BUFFER_MS,
                            DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
                            DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS)
                    .createDefaultLoadControl();

            DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory(Util.getUserAgent(context, "myapp"));

            DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);

            player = new SimpleExoPlayer.Builder(context).setTrackSelector(trackSelector).setLoadControl(loadControl).build();

            if (path.contains("m3u8")) {
                HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(streamUri);
                player.prepare(hlsMediaSource);
            } else {
                MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(streamUri);
                player.prepare(mediaSource);
            }

            player.setPlayWhenReady(true);

            player.addListener(new Player.EventListener() {
                @Override
                public void onPlayerError(ExoPlaybackException error) {
                    player.stop();
                    player.setPlayWhenReady(true);
                }
            });
        }

        if (audioSource.equals(AppConstants.audioSourceLocal)) { //Если источник локальные файлы на устройстве
            if (player != null) {
                player.stop();
            }

            Uri uri = Uri.parse(path);

            DataSource.Factory dataSourceFactory = new FileDataSource.Factory();

            DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);

            player = new SimpleExoPlayer.Builder(context).setTrackSelector(trackSelector).build();

            MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
            player.prepare(mediaSource);

            player.setPlayWhenReady(true);

            playerView.setUseController(true);
            playerView.requestFocus();
            playerView.setPlayer(player);
            playerView.showController();

            player.addListener(new Player.EventListener() {
                @Override
                public void onPlayerError(ExoPlaybackException error) {
                    player.stop();
                    player.setPlayWhenReady(true);
                }
            });
        }
    }

    public static void stopPlayer() {
        player.stop();
    }
}

Переделала так, но если у класса не указать @UnstableApi, выдает много ошибок компиляции. Скажите пожалуйста как все-таки правильно реализовать воспроизведение?

@UnstableApi public class AudioPlayer2 {

    private static ExoPlayer player;
    public static PlayerView playerView;
    public static int MIN_BUFFER_SIZE = 15000;

    public static void startPlayer(String path, String audioSource, Context context) {
        if (audioSource.equals(AppConstants.audioSourceInternet)) {
            startInternetPlayer(path, context);
        } else if (audioSource.equals(AppConstants.audioSourceLocal)) {
            startLocalPlayer(path, context);
        }
    }

    private static void startInternetPlayer(String path, Context context) {
        if (player != null) {
            player.stop();
        }

        Uri streamUri = Uri.parse(path);

        SharedPreferences preferencesBufferSize = PreferenceManager.getDefaultSharedPreferences(context);
        String bufferSizeStr = preferencesBufferSize.getString("player_buffer_size", "15");
        int bufferSize = Integer.parseInt(bufferSizeStr);
        MIN_BUFFER_SIZE = bufferSize * 1000;

        System.out.println(MIN_BUFFER_SIZE + " MIN_BUFFER_SIZE");

        // Для изменения размера буфера
        DefaultLoadControl loadControl = new DefaultLoadControl.Builder()
                .setBufferDurationsMs(MIN_BUFFER_SIZE,
                        DefaultLoadControl.DEFAULT_MAX_BUFFER_MS,
                        DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS,
                        DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS).build();

        //DataSource.Factory dataSourceFactory = new DefaultHttpDataSourceFactory(Util.getUserAgent(context, "myapp"));

        DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);

        player = new ExoPlayer.Builder(context)
                .setTrackSelector(trackSelector)
                .setLoadControl(loadControl)
                .build();

        MediaItem mediaItem;
        if (path.contains("m3u8")) {
            mediaItem = new MediaItem.Builder()
                    .setUri(streamUri)
                    .setMimeType(MimeTypes.APPLICATION_M3U8)
                    .build();
        } else {
            mediaItem = new MediaItem.Builder()
                    .setUri(streamUri)
                    .setMimeType(MimeTypes.APPLICATION_MP4)
                    .build();
        }

        player.setMediaItem(mediaItem);
        player.prepare();
        player.play();

        player.addListener(new Player.Listener() {
            @Override
            public void onPlayerError(PlaybackException error) {
                player.stop();
                player.play();
            }
        });
    }

    private static void startLocalPlayer(String path, Context context) {
        if (player != null) {
            player.stop();
        }

        Uri uri = Uri.parse(path);

        DataSource.Factory dataSourceFactory = new FileDataSource.Factory();

        DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);

        player = new ExoPlayer.Builder(context)
                .setTrackSelector(trackSelector)
                .build();

        MediaItem mediaItem = new MediaItem.Builder()
                .setUri(uri)
                .build();

        player.setMediaItem(mediaItem);
        player.prepare();
        player.play();

        playerView.setUseController(true);
        playerView.requestFocus();
        playerView.setPlayer(player);
        playerView.showController();

        player.addListener(new Player.Listener() {
            @Override
            public void onPlayerError(PlaybackException error) {
                player.stop();
                player.play();
            }
        });
    }

    public static void stopPlayer() {
        if (player != null) {
            player.stop();
        }
    }

}

Ответы (0 шт):