0%

如何用 Java 实现安卓推流 Demo


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:将编码后的数据推送到 RTMP
  • rtmp-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 推流支持