0%

安卓音视频播放

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不卡顿