Android 端集成一个推流库,将采集的画面编码后,通过 RTMP/RTSP 等协议发送到电脑上运行的流媒体服务器(如 MediaMTX),然后在电脑上用 VLC 等播放器拉流观看。
以下以功能全面的 RootEncoder 为例,展示从添加依赖到开始推流的完整代码
- 添加依赖
在项目根目录的 settings.gradle 中添加 JitPack 仓库:
bash
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' } // 添加这行
}
}
在模块的 build.gradle 中添加依赖:
bash
dependencies {
implementation "com.github.pedroSG94.RootEncoder:library:2.2.6"
}
- 配置权限
在 AndroidManifest.xml 中声明必要权限:
bash
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 如果需要在推流时录制视频到本地,需要存储权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
``
在开始推流前,需要准备音频和视频编码器,可以设置分辨率、码率、帧率等参数
`
RootEncoder 提供了多个核心类,最常用的是 RtmpCamera1(基于旧的 Camera1 API)和 RtmpCamera2(基于新的 Camera2 API)。这里以兼容性更好的 RtmpCamera1 为例
```bash
// 关键:初始化 RtmpCamera1,传入 SurfaceView 和连接状态监听器
rtmpCamera = new RtmpCamera1(surfaceView, this);
// 准备视频编码器
boolean videoPrepared = rtmpCamera.prepareVideo(1280, 720, 30, 2000 * 1024, 0);
// 参数解释:宽度, 高度, 帧率(fps), 比特率(bps), 旋转角度(0为不旋转)
// 准备音频编码器
boolean audioPrepared = rtmpCamera.prepareAudio(128 * 1024, 44100, true, false, false);
// 参数解释:比特率, 采样率, 是否立体声, 是否开启回声消除, 是否开启降噪
if (videoPrepared && audioPrepared) {
// 编码器准备成功
} else {
// 编码器准备失败(通常是因为设备不支持该配置)
}
开始推流
bash
// 开始推流 - 地址格式:rtmp://[电脑IP]:1935/live/stream
rtmpCamera.startStream("rtmp://192.168.1.100:1935/live/stream");
// 停止推流
rtmpCamera.stopStream();
// 释放资源(在Activity销毁时调用)
@Override
protected void onDestroy() {
super.onDestroy();
if (rtmpCamera != null) {
rtmpCamera.stopStream();
rtmpCamera.stopPreview();
}
}
连接状态回调
通过实现 ConnectCheckerRtmp 接口,可以监听推流状态
bash
public class LiveActivity extends AppCompatActivity implements ConnectCheckerRtmp {
// ... 其他代码
@Override
public void onConnectionSuccessRtmp() {
runOnUiThread(() -> {
Toast.makeText(this, "推流连接成功", Toast.LENGTH_SHORT).show();
});
}
@Override
public void onConnectionFailedRtmp(String reason) {
runOnUiThread(() -> {
Toast.makeText(this, "推流失败: " + reason, Toast.LENGTH_SHORT).show();
});
}
@Override
public void onDisconnectRtmp() {
runOnUiThread(() -> {
Toast.makeText(this, "推流已断开", Toast.LENGTH_SHORT).show();
});
}
@Override
public void onAuthErrorRtmp() {
runOnUiThread(() -> Toast.makeText(this, "认证错误", Toast.LENGTH_SHORT).show());
}
@Override
public void onAuthSuccessRtmp() {
runOnUiThread(() -> Toast.makeText(this, "认证成功", Toast.LENGTH_SHORT).show());
}
}
测试与验证
启动电脑上的流媒体服务器(如 MediaMTX 或 SRS),确保 RTMP 服务正常运行。
获取电脑内网 IP(如 192.168.1.100)。
运行 Android 应用,点击「开始推流」按钮。
在电脑上用 VLC 播放器拉流验证:
打开 VLC → 「媒体」→「打开网络串流」
输入 rtmp://192.168.1.100:1935/live/stream
点击「播放」,即可看到手机摄像头画面