1. Android音视频开发概述
说实话,每次带新人入门音视频开发,我都会先问一个问题:你知道手机里播放的视频,到底经历了什么才显示在屏幕上的吗?
这个问题看似简单,但能完整答上来的人真不多。我自己当年刚接触这块时,也是一头雾水。记得第一次用MediaPlayer播放视频,觉得好简单啊,几行代码就搞定了。直到后来遇到一个诡异的卡顿问题,才意识到底层的水有多深。
好,咱们今天就把这层窗户纸捅破。
音视频基础概念
先聊聊最基础的东西。你想想看,视频本质上是什么?
说白了,视频就是一串快速切换的图片。人眼有个视觉暂留效应,只要每秒切换足够多的图片,大脑就会觉得画面是连续的。这个每秒切换的次数,就是帧率(FPS)。
但光有画面还不够,还得有声音。音频和视频是两路独立的数据流,播放时需要同步。嗯,这里要注意,音视频同步是开发中最容易踩坑的地方之一。
核心概念速览:
- 采样率:音频每秒采集样本的次数,常见44100Hz、48000Hz
- 比特率:每秒传输的数据量,直接影响画质和文件大小
- 编码格式:H.264、H.265(视频),AAC、MP3(音频)
- 封装格式:MP4、MKV、AVI,相当于容器,把音视频数据打包在一起
我在项目中遇到过最典型的问题:客户给了一个MKV文件,播放器直接崩溃。查了半天才发现,MKV里封装的是H.265编码,而我们的播放器只支持H.264。所以你看,编码格式和封装格式是两码事,千万别搞混。
Android多媒体框架介绍
Android的多媒体框架,这些年变化挺大的。我按时间线给你捋一捋。
| 框架 | API级别 | 特点 |
|---|---|---|
| MediaPlayer | 1+ | 简单易用,适合基础播放 |
| MediaCodec | 16+ | 底层编解码,灵活度高 |
| ExoPlayer | 16+ | Google官方推荐,可定制性强 |
| CameraX + Media3 | 21+ | 现代架构,生命周期感知 |
我个人习惯用ExoPlayer做播放器开发。为什么?因为它解决了MediaPlayer很多痛点,比如不支持动态码率切换、不支持DASH和HLS流媒体。而且ExoPlayer是开源的,遇到问题可以直接看源码。
但如果你要做视频编辑、直播推流这类场景,那就得用MediaCodec了。它直接操作编解码器,性能更好,但代码量也大得多。
我的建议:
初学者先从ExoPlayer入手,把播放流程跑通。等遇到性能瓶颈了,再考虑用MediaCodec做定制优化。别一上来就搞底层,容易劝退。
开发环境搭建与项目初始化
环境搭建这块,我踩过的坑够写一本书了。直接说重点。
首先,Android Studio版本建议用最新稳定版。Gradle版本别乱升级,有时候新版Gradle会跟某些插件不兼容。我曾经因为Gradle从7.4升到8.0,结果项目编译不过,折腾了两天。
创建项目时,选择Empty Activity就行。包名建议用 com.yourname.mediaplayer,别用默认的com.example,后面发布应用时还得改。
接下来是依赖配置。在build.gradle里添加ExoPlayer依赖:
dependencies {
// ExoPlayer核心库
implementation 'androidx.media3:media3-exoplayer:1.2.0'
// UI组件
implementation 'androidx.media3:media3-ui:1.2.0'
// 流媒体支持(HLS、DASH)
implementation 'androidx.media3:media3-exoplayer-hls:1.2.0'
implementation 'androidx.media3:media3-exoplayer-dash:1.2.0'
// 权限处理
implementation 'com.karumi:dexter:6.2.3'
}
注意版本号要统一,别混用不同版本的Media3库,否则运行时可能报ClassNotFoundException。
避坑指南:
我曾经在项目里同时引用了ExoPlayer的旧版(2.x)和新版(Media3 1.x),结果两个版本的类冲突了。编译没问题,一运行就崩溃。所以一定要统一版本,要么全用旧版,要么全用新版。
权限声明也别忘。Android 13以上需要细粒度媒体权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
嗯,到这里环境就搭好了。你可以先写个简单的MainActivity,创建一个ExoPlayer实例,播放一个网络视频试试。代码大概长这样:
// 创建播放器
ExoPlayer player = new ExoPlayer.Builder(context).build();
// 准备媒体资源
MediaItem mediaItem = MediaItem.fromUri("https://example.com/video.mp4");
player.setMediaItem(mediaItem);
// 绑定到PlayerView
playerView.setPlayer(player);
// 开始播放
player.prepare();
player.play();
就这么几行,一个基本的播放器就跑起来了。是不是比想象中简单?
知识体系总览
最后,我用一张图把本章的核心内容串起来。你对照着看,心里就有谱了。
这张图把本章的知识点都串起来了。从左到右,从基础到实践,你按这个路线走就行。
好了,这一章就到这里。环境搭好了,代码也写了,接下来就可以开始真正的播放器开发了。记住,动手是最好的学习方式。
公众号:蓝海资料掘金营,微信deep3321