ARTICLE · 1079604
2026你的App还在用MediaPlayer?Android视频播放技术全家桶详解
从系统内置到谷歌亲儿子,从B站神器到FFmpeg大法,一文帮你彻底搞懂
开场白:一个播放器引发的血案
项目中视频播放卡顿、格式不支持、起播慢、OOM频繁。别人问怎么回事,打开代码一看——还在用VideoView+MediaPlayer硬扛。
这都2026年了,Android视频播放技术早就迭代了好几轮。今天我把这些年踩过的坑、用过的播放器、淌过的水,一次性给你讲透。
一、MediaPlayer:老兵不死,只是该退休了
MediaPlayer是Android系统内置的播放器,API从API 1就有了,简单粗暴。
text
// MediaPlayer基本用法
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource("https://example.com/video.mp4");
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
优点:系统自带,无需引入额外依赖,简单场景够用。缺点:不支持HLS/DASH流媒体,扩展性差,不同厂商系统表现差异大。
结论:如果是本地播放一个MP4,MediaPlayer还能凑合。但凡涉及网络流媒体、直播、自适应码率,趁早换。
二、ExoPlayer:谷歌亲儿子,Android播放器的不二之选
ExoPlayer是Google开源的播放器,已被纳入官方Media3库。如果说MediaPlayer是功能机,ExoPlayer就是智能手机。
2.1 依赖配置(注意新老版本差异)
2026年的ExoPlayer已经整合到Media3中,别再引入旧版的com.google.android.exoplayer了:
text
// 最新版依赖(Media3统一)
implementation "androidx.media3:media3-exoplayer:1.4.0"
implementation "androidx.media3:media3-exoplayer-hls:1.4.0" // HLS支持
implementation "androidx.media3:media3-exoplayer-dash:1.4.0" // DASH支持
2.2 基础播放代码
text
// 创建ExoPlayer实例
SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build();
// 设置媒体源
MediaItem mediaItem = MediaItem.fromUri("https://example.com/video.mp4");
player.setMediaItem(mediaItem);
player.prepare();
player.play();
2.3 自适应码流(ExoPlayer核心优势)
ExoPlayer原生支持HLS和DASH,自动根据网络状况切换清晰度:
text
// HLS直播流播放
MediaItem hlsItem = MediaItem.fromUri("https://example.com/stream.m3u8");
player.setMediaItem(hlsItem);
player.prepare();
ExoPlayer包体积仅1.1MB,相比其他方案轻量得多。2026年Media3 1.10版本进一步增强了对Dolby Vision Profile 10和VVC的支持,还实验性地支持动态调度播放循环,可以显著降低功耗。
结论:如果你的场景是点播、短视频、常规直播流,ExoPlayer是首选。
三、IJKPlayer:B站出品,流媒体协议支持最全
IJKPlayer是B站开源的播放器,基于FFmpeg深度定制。
3.1 核心优势
对RTSP、RTMP等协议支持极好。如果你需要播放监控摄像头RTSP流或RTMP推流,IJKPlayer几乎是必选。
text
// IJKPlayer初始化
IjkMediaPlayer ijkPlayer = new IjkMediaPlayer();
ijkPlayer.setDataSource("rtsp://192.168.1.100/stream");
ijkPlayer.prepareAsync();
ijkPlayer.start();
3.2 致命问题
IJKPlayer官方已基本停止维护。GitHub上最后一次重大更新还是几年前。这意味着遇到新系统兼容性问题,你得自己解决。
完整版IJKPlayer的so库加起来约8MB,对APK体积敏感的项目需要裁剪。
结论:非RTSP/RTMP场景不推荐。如果必须用,考虑配合GSYVideoPlayer使用,方便切换内核。
四、GSYVideoPlayer:国产之光,内核自由切换
GSYVideoPlayer是国内开发者CarGuo开源的播放器框架,最大特色是支持在IJKPlayer、ExoPlayer、MediaPlayer三种内核间自由切换。
text
// 切换内核只需一行代码
PlayerFactory.setPlayManager(IjkPlayerManager.class); // 用IJK
// PlayerFactory.setPlayManager(ExoPlayerManager.class); // 用Exo
一句话总结:GSYVideoPlayer是个播放器外壳,底层可以插不同的播放引擎。适合需要灵活切换内核、应对不同视频源场景的项目。
五、FFmpeg:终极武器,但请慎用
FFmpeg是音视频处理的瑞士军刀——转码、剪辑、合成、推流无所不能。
text
// FFmpeg命令行示例:格式转换
ffmpeg -i input.mp4 -vcodec libx264 -acodec aac output.flv
5.1 MobileFFmpeg(移动端方案)
移动端推荐使用MobileFFmpeg,支持Android 5.0+,2025年仍有更新,支持硬编硬解。
text
// Android端推流示例
String[] command = {
"-f", "android_camera",
"-vcodec", "h264_mediacodec", // 硬编码
"-f", "flv", "rtmp://server/live/stream"
};
MobileFFmpeg.execute(command);
警告:FFmpeg是纯C/C++库,集成后APK体积剧增(完整版可能增加20MB+),学习曲线陡峭。不要为了播放一个MP4就上FFmpeg。只有涉及转码、剪辑、推流等复杂处理时才值得引入。
六、终极选型决策表
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 本地简单MP4播放 | MediaPlayer | 无额外依赖,够用 |
| 点播/短视频/HLS/DASH | ExoPlayer | 谷歌官方,轻量(1.1MB),持续更新 |
| RTSP/RTMP直播 | IJKPlayer + GSYVideoPlayer | 协议支持最全,方便内核切换 |
| 复杂音视频处理(转码/剪辑) | FFmpeg/MobileFFmpeg | 功能最强,但体积大、学习成本高 |
| 低延迟互动直播(<1秒) | WebRTC | 全端互通,延迟最低 |
七、2026年新趋势:预加载来了
Media3 1.10版本推出了PreloadManager,支持在用户滑动Feed时就提前加载视频数据。对于短视频应用来说,这能显著缩短起播时间:
text
// 预加载配置:提前加载下一个视频5秒内容
player.preloadConfiguration =
PreloadConfiguration(/* targetPreloadDurationUs= */ 5_000_000L)
这一功能对用户体验的提升是质的飞跃——用户滑到视频时,内容已经准备好了。
写代码选播放器,和娶媳妇一样:适合自己的才是最好的。别为了炫技强行上FFmpeg,也别图省事抱着MediaPlayer不撒手。把这个表收藏好,用到的时候翻出来看一眼,少走三个月弯路。
如果觉得有用,点赞、在看、转发三连走起。