title: 如何用 Java 实现安卓推流 Demo(MediaProjection + MediaCodec + FFmpeg)
date: 2025-07-11 21:35:00
tags:
- Android
- 推流
- Java
- FFmpeg
categories:
- 安卓开发
💡 项目背景
在无人机、车载设备等场景下,经常需要将屏幕内容实时录制并推送到服务器(RTMP 流媒体服务器),以便实现远程监控、直播等功能。
本文将介绍如何使用 Java 实现一个 Android 推流 Demo,采用的技术栈包括:
MediaProjection:获取屏幕内容MediaCodec:硬件编码 H.264 视频流Mobile-FFmpeg:将编码后的数据推送到 RTMPrtmp-rtsp-stream-client-java:简化推流实现
📦 技术要点
1. 权限申请(录屏 + 网络)
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
2. 初始化 MediaProjection
使用系统提供的录屏能力:
java
复制
编辑
MediaProjectionManager mProjectionManager =
(MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
Intent captureIntent = mProjectionManager.createScreenCaptureIntent();
startActivityForResult(captureIntent, REQUEST_CODE_CAPTURE);
3. 使用 MediaCodec 进行编码
配置编码器输出:
java
复制
编辑
MediaCodec codec = MediaCodec.createEncoderByType("video/avc");
MediaFormat format = MediaFormat.createVideoFormat("video/avc", 720, 1280);
format.setInteger(MediaFormat.KEY_BIT_RATE, 4 * 1024 * 1024);
format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
4. 推流 RTMP(FFmpeg 方案)
你可以通过 Mobile-FFmpeg 执行推流命令:
bash
复制
编辑
ffmpeg -re -i /sdcard/output.mp4 -c:v copy -f flv rtmp://your-server/live/stream
也可以通过 Java 使用:
java
复制
编辑
FFmpeg.execute("-f rawvideo -pix_fmt yuv420p -s 720x1280 -i pipe:0 -f flv rtmp://...");
🔧 工程结构建议
cpp
复制
编辑
app/
├── MainActivity.java
├── encoder/ // MediaCodec 封装
├── ffmpeg/ // 推流接口封装
├── service/ // 前台服务录屏
└── ui/
🎯 推流测试地址
你可以部署 Nginx + RTMP 模块,配置地址如:
arduino
复制
编辑
rtmp://192.168.1.100/live/test
✅ 最终效果
启动应用后点击“开始推流”
系统弹出录屏权限
成功后开始将画面推流到 RTMP 服务器
可通过 VLC 或网页播放流
💬 总结
本文介绍了如何用 Java 实现安卓屏幕推流功能,适合无人机、车载系统、远程教学等场景。
后续可以扩展:
音频录制同步推流
摄像头推流(代替屏幕)
RTSP 推流支持