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