1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| Android 视频与音频播放全解析:自带方案 + 第三方库实战 1️⃣ 技术背景
在移动端开发中,音视频播放是非常常见的功能,例如短视频、直播、音乐播放器等。Android 提供了内置的播放方案,但在复杂业务场景下,通常需要第三方播放器来实现更多功能,比如多格式支持、缓存、后台播放、字幕和流媒体播放。
全面理解 Android 视频音频播放,从基础方案到第三方库使用。
2️⃣ 内置播放方案 2.1 VideoView / MediaPlayer
VideoView 是 Android 提供的高层封装控件,快速上手。
MediaPlayer 是更底层的音视频播放类,支持更多自定义操作。
示例代码:VideoView 播放本地和网络视频 val videoView: VideoView = findViewById(R.id.videoView) val uri = Uri.parse("http://example.com/video.mp4") videoView.setVideoURI(uri) videoView.setMediaController(MediaController(this)) videoView.start()
MediaPlayer 播放音频 val mediaPlayer = MediaPlayer() mediaPlayer.setDataSource("http://example.com/audio.mp3") mediaPlayer.prepareAsync() mediaPlayer.setOnPreparedListener { it.start() }
优点:简单、快速、适合本地或单个视频 缺点:功能有限,不支持多码率、缓存或复杂格式
2.2 ExoPlayer
特点:由 Google 官方提供,功能丰富
支持 HLS、DASH、SmoothStreaming、RTMP 等流媒体
支持缓存、后台播放、字幕、速度调节
集成依赖 implementation "com.google.android.exoplayer:exoplayer:2.18.6" implementation "com.google.android.exoplayer:exoplayer-ui:2.18.6"
示例代码 val player = ExoPlayer.Builder(this).build() val playerView: PlayerView = findViewById(R.id.playerView) playerView.player = player
val mediaItem = MediaItem.fromUri("http://example.com/video.mp4") player.setMediaItem(mediaItem) player.prepare() player.play()
3️⃣ 第三方播放器推荐 3.1 IjkPlayer
特点:基于 FFmpeg,支持几乎所有音视频格式
适合:直播、RTMP、复杂视频格式
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
val ijkVideoView: IjkVideoView = findViewById(R.id.ijkVideoView) ijkVideoView.setVideoPath("http://example.com/live/stream.m3u8") ijkVideoView.start()
3.2 Vitamio
特点:兼容性好,支持多种视频格式、网络流和字幕
适合:旧项目或需要快速支持多格式
implementation 'io.vov.vitamio:vitamio:5.0.2'
val videoView: io.vov.vitamio.widget.VideoView = findViewById(R.id.videoView) videoView.setVideoURI(Uri.parse("http://example.com/video.mp4")) videoView.start()
3.3 ExoPlayer / Media3(音频播放)
特点:Google 官方支持,适合音频流应用
implementation 'androidx.media3:media3-exoplayer:1.1.1' implementation 'androidx.media3:media3-ui:1.1.1'
val player = ExoPlayer.Builder(this).build() val playerView: PlayerView = findViewById(R.id.playerView) playerView.player = player
val mediaItem = MediaItem.fromUri("https://example.com/audio.mp3") player.setMediaItem(mediaItem) player.prepare() player.play()
4️⃣ 播放优化建议 优化点 说明 后台播放 使用 ForegroundService + MediaSession,保证音乐/视频在后台继续播放 缓存与预加载 ExoPlayer 提供 CacheDataSource 支持本地缓存和预加载 音频焦点 管理 AudioFocus 避免与电话或其他音频冲突 UI 不卡顿 解码在后台线程,渲染在 SurfaceView / TextureView 5️⃣ 实战技巧
播放列表:结合 RecyclerView + ExoPlayer 管理多视频
字幕和弹幕:Media3 或自定义 OverlayView 实现
多码率流:使用 ExoPlayer TrackSelector 自动切换清晰度
快进/慢放:ExoPlayer PlaybackParameters 可以控制播放速度
6️⃣ 播放流程图(示意) [UI交互] -> [Player控件] -> [解码器/ExoPlayer] -> [渲染到SurfaceView/TextureView] ↓ [缓存模块] -> [网络/本地数据源] ↓ [后台服务 / MediaSession]
7️⃣ 总结
自带方案(VideoView / MediaPlayer)简单快速,适合本地播放或基础网络播放
ExoPlayer 功能丰富,适合流媒体播放、缓存、字幕和复杂播放需求
IjkPlayer / Vitamio 在直播、多格式和高兼容性项目中不可替代
关键优化点:后台播放、缓存管理、音频焦点、UI不卡顿
|