在Android开发中播放视频主要通过以下几种核心类实现:
1. VideoView
最基础的视频播放控件,继承自SurfaceView。内置MediaPlayer实现,支持常见格式(MP4、3GP等)。优点在于集成简单,适合基础需求。常用方法包括`setVideoPath()`、`start()`、`pause()`等。局限性在于不支持流媒体协议(如RTMP)、自定义渲染或高级播放控制。需注意直接访问本地文件需要READ_EXTERNAL_STORAGE权限。
2. MediaPlayer
底层多媒体播放核心类,可处频/视频。需要手动绑定SurfaceView或TextureView显示画面。典型流程为:`setDataSource()`→`prepare()`→`start()`。支持网络流(需声明INTERNET权限)和本地资源。扩展性更强,但需自行处理缓冲、错误回调(通过setOnErrorListener)和生命周期管理(如release()释放资源)。
3. ExoPlayer
Google开源的现代化播放器库,优势在于:
- 支持自适应流媒体(DASH、HLS、SmoothStreaming)
- 可扩展的渲染器/组件架构
- 更高效的硬解码兼容性
- 动态播放质量调整
需添加依赖`implementation 'com.google.android.exoplayer:exoplayer-core:2.X.X'`,核心类包括`SimpleExoPlayer`、`DefaultRenderersFactory`等,可配置LoadControl控制缓冲策略。
4. Media3(Jetpack组件)
Android官方新一代多媒体框架,整合了ExoPlayer的优势并标准化接口。包含`Player`接口和`ExoPlayer`实现类,支持音频焦点管理、后台播放等场景。需依赖`androidx.media3`系列库。
5. SurfaceView与TextureView
- SurfaceView:独立绘制层,性能更好但无法应用动画/透明度。
- TextureView:作为View树的一部分,支持变换但消耗更多资源。需在`onSurfaceTextureAvailable`回调中绑定MediaPlayer。
扩展知识点:
格式兼容性:Android默认支持H.264/AVC、H.265/HEVC(API 21+),VP9需设备支持;
DRM保护内容:通过MediaDrm类实现数字版权管理;
FFmpeg集成:通过NDK调用可扩展解码能力,但需处理性能与包体积问题;
自适应码率:ExoPlayer的`TrackSelector`可动态切换不同分辨率轨道;
后台播放:需结合Service与MediaSessionCompat实现,并处频焦点争夺。
开发建议:
1. 简单场景用VideoView,复杂需求选择ExoPlayer;
2. 网络播放务必添加超时和重试逻辑;
3. 使用`MediaMetadataRetriever`提取视频元数据(时长、分辨率等);
4. 针对折叠屏设备需处理Surface尺寸动态变化。