首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 線上音樂播放器開發指南

     編輯:程式設計疑難解答

核心架構

線上音樂播放器主要包含三大模組:

  1. 媒體資料來源:HTTP/HTTPS 音訊串流、MediaSource、HLS/DASH 協定
  2. 播放引擎:MediaPlayer、ExoPlayer、Media3
  3. UI 與控制:播放/暫停、進度條、播放清單、背景播放服務

技術選型建議

推薦:ExoPlayer / Media3 (Google 官方維護)

  • 支援 DASH、HLS、SmoothStreaming 等自適應串流協定
  • 快取、預載入、無縫切換、DRM 保護
  • 模組化架構,易擴展自定義渲染器、資料源
  • 支援 Android 4.1+ (API 16+)

舊方案:MediaPlayer(不建議新專案使用)

  • API 簡單但功能有限
  • 不支援自適應串流、快取控制
  • 錯誤處理、狀態管理困難

ExoPlayer 核心實作步驟

1. 依賴導入 (build.gradle)

implementation "com.google.android.exoplayer:exoplayer:2.19.1"
implementation "com.google.android.exoplayer:exoplayer-ui:2.19.1" // 含 PlayerView

2. 版面配置

<com.google.android.exoplayer2.ui.PlayerView
    android:id="@+id/player_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:controller_layout_id="@layout/custom_controller"
    app:show_buffering="when_playing"
    app:resize_mode="fit" />

3. 播放器初始化與播放

SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build();
PlayerView playerView = findViewById(R.id.player_view);
playerView.setPlayer(player);

// 建立媒體項目 (支援 HTTP、HLS、DASH)
MediaItem mediaItem = MediaItem.fromUri("https://example.com/music.mp3");
player.setMediaItem(mediaItem);
player.prepare();
player.playWhenReady = true;

4. 生命週期管理

@Override
protected void onStart() {
    super.onStart();
    if (player != null) player.playWhenReady = true;
}

@Override
protected void onStop() {
    super.onStop();
    if (player != null) player.playWhenReady = false;
}

@Override
protected void onDestroy() {
    super.onDestroy();
    player?.release();
    player = null;
}

進階功能實作

背景播放 (MediaSession + Foreground Service)

// MediaSessionCompat 建立
MediaSessionCompat mediaSession = new MediaSessionCompat(this, "MusicService");
mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
                      MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);

// 連結 ExoPlayer
MediaControllerCompat mediaController = new MediaControllerCompat(this, mediaSession.getSessionToken());
MediaControllerCompat.setMediaController(this, mediaController);

// 設定播放狀態、元資料、傳輸控制...

音訊快取 (CacheDataSource)

Cache cache = new SimpleCache(cacheDir, new LeastRecentlyUsedCacheEvictor(maxSize));
DataSource.Factory cacheFactory = new CacheDataSource.Factory()
    .setCache(cache)
    .setUpstreamDataSourceFactory(new DefaultHttpDataSource.Factory())
    .setCacheWriteDataSinkFactory(new CacheDataSink.Factory());

player = new SimpleExoPlayer.Builder(context)
    .setMediaSourceFactory(new DefaultMediaSourceFactory(cacheFactory))
    .build();

播放清單與無縫切換

ConcatenatingMediaSource playlist = new ConcatenatingMediaSource(
    mediaSource1, mediaSource2, mediaSource3);
player.setMediaSource(playlist);

常見問題排查

問題可能原因解決方案
播放卡頓緩衝不足、網路不穩啟用快取、調整緩衝參數、使用 CDN
背景播放被系統殺掉未使用 Foreground Service實作 MediaSession + Foreground Service
特定格式無法播放缺少解碼器、DRM 保護確認格式支援、整合 Widevine/PlayReady
音訊焦點搶佔未處理 AudioFocus實作 AudioFocusRequest、暫停/降音邏輯

學習資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved