如何在android中实现Exoplayer 2.11.1?

hiz5n14c  于 2023-09-28  发布在  Android
关注(0)|答案(5)|浏览(243)

我正在尝试实现exoplayer这是我的exoplayer版本

  1. implementation 'com.google.android.exoplayer:exoplayer:2.11.1'

我正在创建一个音乐播放器应用程序,我不知道任何关于exoplayer我试图实现exoplayer从过去2天,但它不工作.官方文件里的东西我一点也看不懂。
我找到了很多例子和教程,但都是关于使用exoplayer播放视频。很多例子都使用了过时的方法。
我尝试使用这个tutorial来实现,但是很多方法都被弃用了,所以它不能正常工作。

  1. simpleExoplayer = ExoPlayerFactory.newSimpleInstance(
  2. DefaultRenderersFactory(this),
  3. DefaultTrackSelector(adaptiveTrackSelectionFactory),
  4. DefaultLoadControl()
  5. )

任何人都可以建议我从哪里开始,或者我如何使用最新版本的exoplayer构建音乐流媒体应用程序。
如有任何帮助,我们将不胜感激。

j9per5c4

j9per5c41#

通过新的更新,您可以使用SimpleExoPlayer.Builder创建一个简单的播放器示例:

  1. simpleExoplayer = SimpleExoPlayer.Builder(context).build()

您还可以为Builder提供不同的参数。参见https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.Builder.html
您可以使用我创建的这个简单的自定义类来帮助您入门。

  1. class ExoPlayerHelper(
  2. private val playerView: PlayerView,
  3. onError: (ExoPlaybackException) -> Unit,
  4. onPlayerBuffer: (Boolean) -> Unit
  5. ) {
  6. private var exoPlayer: ExoPlayer? = null
  7. private var mediaSource: ProgressiveMediaSource? = null
  8. private val playerListener = object : Player.EventListener {
  9. override fun onPlayerError(error: ExoPlaybackException) {
  10. super.onPlayerError(error)
  11. onError(error)
  12. }
  13. override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
  14. super.onPlayerStateChanged(playWhenReady, playbackState)
  15. onPlayerBuffer(playbackState == Player.STATE_BUFFERING)
  16. }
  17. }
  18. fun initializePlayer(url: String) {
  19. exoPlayer = SimpleExoPlayer.Builder(playerView.context).build()
  20. exoPlayer!!.repeatMode = Player.REPEAT_MODE_ALL
  21. exoPlayer!!.addListener(playerListener)
  22. playerView.player = exoPlayer
  23. val userAgent =
  24. Util.getUserAgent(playerView.context, playerView.context.getString(R.string.app_name))
  25. mediaSource = ProgressiveMediaSource
  26. .Factory(
  27. DefaultDataSourceFactory(playerView.context, userAgent),
  28. DefaultExtractorsFactory()
  29. )
  30. .createMediaSource(Uri.parse(url))
  31. exoPlayer!!.prepare(mediaSource!!, true, false)
  32. exoPlayer!!.playWhenReady = true
  33. }
  34. private fun killPlayer() {
  35. if (exoPlayer != null) {
  36. exoPlayer!!.release()
  37. exoPlayer = null
  38. mediaSource = null
  39. playerView.player = null
  40. }
  41. }
  42. }
展开查看全部
6qqygrtg

6qqygrtg2#

我也面临这个问题,这是我的解决方案

Declaration

  1. private val exoPlayer: SimpleExoPlayer by lazy { SimpleExoPlayer.Builder(this).build()}

播放歌曲

  1. private fun prepareExoPlayerFromURL(url: String) {
  2. val dataSourceFactory =
  3. DefaultDataSourceFactory(this, Util.getUserAgent(this, resources.getString(R.string.app_name)), null)
  4. val extractorsFactory = DefaultExtractorsFactory()
  5. // val audioSource = ExtractorMediaSource(uri, dataSourceFactory, extractorsFactory, null, null)
  6. val concateMediaSource = ConcatenatingMediaSource()
  7. // to play from song list
  8. for (i in mSongList) { // song list song arraylist
  9. val mediaSource = ProgressiveMediaSource
  10. .Factory(
  11. DefaultDataSourceFactory(this, dataSourceFactory),
  12. DefaultExtractorsFactory()
  13. )
  14. .createMediaSource(Uri.parse(i.musicFile)/*Uri.parse(i.uri)*/)
  15. concateMediaSource.addMediaSource(mediaSource)
  16. }
  17. // to play single song
  18. /* val audioSource = ProgressiveMediaSource
  19. .Factory(
  20. DefaultDataSourceFactory(this, dataSourceFactory),
  21. DefaultExtractorsFactory()
  22. )
  23. .createMediaSource(Uri.parse(url))*/
  24. exoPlayer.prepare(concateMediaSource/*audioSource*/)
  25. exoPlayer.seekToDefaultPosition(songPosition)
  26. exoPlayer.playWhenReady = true
  27. setNotification()
  28. }

设置播放器和通知的**监听器

  1. private fun setListoner() {
  2. exoPlayer.addListener(object : Player.EventListener {
  3. override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
  4. when (playbackState) {
  5. Player.STATE_BUFFERING -> Log.e(TAG,"STATE_BUFFERING")
  6. Player.STATE_ENDED -> Log.e(TAG,"STATE_ENDED")
  7. Player.STATE_IDLE -> Log.e(TAG,"STATE_IDLE")
  8. Player.STATE_READY ->{
  9. if (playWhenReady) {
  10. Log.e(TAG, "PlaybackStatus.PLAYING")
  11. } else {
  12. Log.e(TAG, "PlaybackStatus.PAUSED")
  13. }
  14. }
  15. else -> Log.e(TAG,"PlaybackStatus.IDLE")
  16. }
  17. }
  18. })
  19. }

杀死玩家

  1. private fun onDestroy() {
  2. if (exoPlayer != null) {
  3. exoPlayer.release()
  4. exoPlayer = null
  5. mediaSource = null
  6. }
  7. }

有关更多详细信息,请参见official documentation
Universal Music Player使用ExoPlayer进行本地音频播放。
Building feature-rich media apps with ExoPlayer (Google I/O '18)

展开查看全部
l5tcr1uw

l5tcr1uw3#

For Java Guys(Java万岁)

活动中

  1. private PlayerView epPlayerView = findViewById(R.id.design_reference);

公共功能

  1. public static void runExoPlayer(PlayerView epPlayerView,
  2. String url,
  3. Context context) {
  4. Uri videoUri = Uri.parse(url);
  5. SimpleExoPlayer exoPlayer = new SimpleExoPlayer.Builder(context).build();
  6. epPlayerView.setPlayer(exoPlayer);
  7. MediaItem mediaItem = MediaItem.fromUri(videoUri);
  8. exoPlayer.clearMediaItems();
  9. exoPlayer.setMediaItem(mediaItem);
  10. exoPlayer.prepare();
  11. exoPlayer.setPlayWhenReady(true);
  12. }

构建Gradle

  1. // Exo Media Player
  2. implementation 'com.google.android.exoplayer:exoplayer:2.15.1'
  3. implementation 'com.google.android.exoplayer:exoplayer-core:2.15.1'
  4. implementation 'com.google.android.exoplayer:exoplayer-ui:2.15.1'
  5. implementation 'com.google.android.exoplayer:exoplayer-dash:2.15.1'
  6. implementation 'com.google.android.exoplayer:exoplayer-hls:2.15.1'
  7. implementation 'com.google.android.exoplayer:exoplayer-smoothstreaming:2.15.1'
  8. androidTestImplementation 'androidx.test:rules:1.4.0'
展开查看全部
fafcakar

fafcakar4#

在2.15.0版本之前,您可以按以下方式创建SimpleExoPlayer示例:

  1. SimpleExoPlayer.Builder(this)
  2. .setMediaSourceFactory(mediaSourceFactory)
  3. .build()

在2.16.0版本中,不推荐使用SimpleExoPlayer,您应该改用ExoPlayer示例。可以按以下方式创建:

  1. ExoPlayer.Builder(this)
  2. .setMediaSourceFactory(mediaSourceFactory)
  3. .build()

https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.Builder.html

guykilcj

guykilcj5#

1.调用此方法:

  1. private void initializePlayer() {
  2. FloatingWidgetService.hidePipPlayer();
  3. binding.videoOverlay.setVisibility(View.GONE);
  4. liveTvexoPlayer = new SimpleExoPlayer.Builder(context).build();
  5. binding.playerView.setPlayer(liveTvexoPlayer);
  6. binding.playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);
  7. binding.playerView.setUseController(true);
  8. liveTvexoPlayer.setPlayWhenReady(true);
  9. liveTvexoPlayer.seekTo(0);
  10. appManageInterface.setLiveTvVideo(playBackUrl, "getReady", 0);
  11. Prefs.getPrefInstance().setValue(context, Const.VIDEO_URL, playBackUrl);
  12. imgViewChangeScreenOrientation = binding.playerView.findViewById(R.id.exo_fullscreen_icon);
  13. imgViewChangeScreenOrientation.setOnClickListener(new View.OnClickListener() {
  14. @Override
  15. public void onClick(View v) {
  16. liveTvexoPlayer.setPlayWhenReady(false);
  17. liveTvexoPlayer.release();
  18. Intent serviceIntent = new Intent(context, FloatingWidgetService.class);
  19. serviceIntent.putExtra("videoUri", playBackUrl);
  20. serviceIntent.putExtra("isfrom", "livetv");
  21. // serviceIntent.putExtra("videoUri", "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/SubaruOutbackOnStreetAndDirt.mp4");
  22. getActivity().startService(serviceIntent);
  23. }
  24. });
  25. AudioAttributes audioAttributes = new AudioAttributes.Builder()
  26. .setUsage(C.USAGE_MEDIA)
  27. .setContentType(C.CONTENT_TYPE_MOVIE)
  28. .build();
  29. if (liveTvexoPlayer.getAudioComponent() != null)
  30. liveTvexoPlayer.getAudioComponent().setAudioAttributes(audioAttributes, true);
  31. try {
  32. if (!playBackUrl.equals("")) {
  33. DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, getResources().getString(R.string.app_name)));
  34. MediaSource videoSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(playBackUrl));
  35. liveTvexoPlayer.prepare(videoSource, true, true);
  36. }
  37. } catch (Exception e) {
  38. }
  39. liveTvexoPlayer.addListener(new Player.EventListener() {
  40. @Override
  41. public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
  42. }
  43. @Override
  44. public void onPlayerError(ExoPlaybackException error) {
  45. switch (error.type) {
  46. case TYPE_SOURCE:
  47. binding.videoOverlay.setVisibility(View.VISIBLE);
  48. break;
  49. case TYPE_RENDERER:
  50. case TYPE_UNEXPECTED:
  51. liveTvexoPlayer.retry();
  52. break;
  53. case TYPE_OUT_OF_MEMORY:
  54. case TYPE_REMOTE:
  55. AppUtil.show_Snackbar(context, binding.playerView, error.getMessage(), true);
  56. break;
  57. }
  58. }
  59. });
  60. }

1.使用以下方法管理exoplayer:

  1. @Override
  2. public void onResume() {
  3. super.onResume();
  4. mTracker.setScreenName("Screen - " + "Live Tv");
  5. mTracker.send(new HitBuilders.ScreenViewBuilder().build());
  6. binding.playerView.onResume();
  7. if (liveTvexoPlayer != null)
  8. liveTvexoPlayer.setPlayWhenReady(true);
  9. }
  10. @Override
  11. public void onStart() {
  12. super.onStart();
  13. binding.playerView.onResume();
  14. if (liveTvexoPlayer != null)
  15. liveTvexoPlayer.setPlayWhenReady(true);
  16. }
  17. @Override
  18. public void onPause() {
  19. binding.playerView.onPause();
  20. if (liveTvexoPlayer != null) {
  21. liveTvexoPlayer.setPlayWhenReady(false);
  22. }
  23. super.onPause();
  24. }
  25. @Override
  26. public void onStop() {
  27. binding.playerView.onPause();
  28. if (liveTvexoPlayer != null)
  29. liveTvexoPlayer.setPlayWhenReady(false);
  30. super.onStop();
  31. }
  32. @Override
  33. public void onDestroy() {
  34. binding.playerView.onPause();
  35. if (liveTvexoPlayer != null) {
  36. liveTvexoPlayer.release();
  37. liveTvexoPlayer = null;
  38. }
  39. super.onDestroy();
  40. }
展开查看全部

相关问题