什么是 RTSP 服务器?
RTSP (Real Time Streaming Protocol) 是一个应用层协议,用于控制媒体服务器向客户端(如 VLC、手机、电脑播放器)传输实时媒体数据(如视频、音频)。

RTSP 服务器就像一个“视频管家”,你的 Android 设备(手机、平板、开发板)通过摄像头捕获视频,然后这个“管家”负责:
- 接收来自摄像头的视频流。
- 响应来自客户端(如另一台手机)的请求:“我想看视频”。
- 协商好传输方式(比如用什么编码,H.264 还是 H.265)。
- 发送视频流给客户端。
在 Android 上实现 RTSP 服务器,通常意味着将设备的摄像头作为视频源,通过 Wi-Fi 或以太网将实时画面推送给网络上的其他设备。
Android 实现 RTSP 服务器的几种主流方案
由于 Android 系统本身不提供原生的 RTSP 服务器功能,我们需要借助第三方库或框架,以下是几种最常见和可靠的方案:
使用成熟的第三方库(推荐)
这是最简单、最高效的方式,特别适合快速开发和集成,这些库已经封装了复杂的底层逻辑(如音视频编码、网络传输、RTSP 协议)。

FFmpeg + librtsp
这是最经典、功能最强大的组合,但集成相对复杂。
-
FFmpeg: 一个强大的音视频处理工具集,它包含了各种音视频编解码器(如 H.264, AAC)、封装格式(如 MP4, FLV)和协议(如 RTSP, RTMP),你可以用它来编码摄像头捕获的 YUV/NV21 数据,并封装成 RTSP 流。
-
librtsp: 一个轻量级的 RTSP 服务器库,FFmpeg 本身也包含了 RTSP 的实现,但
librtsp是一个更纯粹的、易于集成的库。 -
工作流程:
(图片来源网络,侵删)- 在 Android 上通过
Camera2API 或CameraX获取摄像头预览数据(通常是 YUV 格式)。 - 将 YUV 数据传递给 FFmpeg 的编码器,将其编码为 H.264 视频。
- 获取麦克风输入,编码为 AAC 音频。
- 将编码后的 H.264 和 AAC 数据流传递给 FFmpeg 的 RTSP 服务器封装器。
- FFmpeg 负责创建一个监听端口(如 554),响应客户端的
SETUP,PLAY等命令,并开始发送数据流。
- 在 Android 上通过
-
优点:
- 功能极其强大,支持几乎所有编解码格式和协议。
- 社区庞大,资料丰富。
-
缺点:
- 集成复杂,需要自己编译或寻找预编译好的 FFmpeg 库(
.so文件)。 - 体积较大,会增加 APK 大小。
- 对新手不友好。
- 集成复杂,需要自己编译或寻找预编译好的 FFmpeg 库(
Live555
这是一个专门为流媒体设计的 C++ 库,非常轻量级且稳定。
-
工作流程:
- 同样,通过
Camera2API 获取视频帧。 - 将视频帧(如 H.264 NALU)封装成
RTP(Real-time Transport Protocol) 包。 - 使用 Live555 提供的类(如
RTSPServer,ServerMediaSession)来创建一个 RTSP 服务器实例。 - 将封装好的 RTP 流注册到
ServerMediaSession中。 - Live555 会自动处理 RTSP 信令(协商、控制)和 RTP 数据包的发送。
- 同样,通过
-
优点:
- 专门为流媒体设计,非常稳定可靠。
- 代码清晰,易于理解和定制。
- 体积小。
-
缺点:
- 需要自己处理视频的编码和 RTP 封装逻辑。
- 同样需要 JNI/C++ 集成。
Android-Camera2RTSP
这是一个更现代、更专注于 Android 的开源项目,它极大地简化了集成过程。
-
核心思想: 它封装了
Camera2API 和 RTSP 服务器的所有细节,你只需要调用几行 Java/Kotlin 代码就能启动一个 RTSP 服务。 -
工作流程:
- 在
build.gradle中添加依赖。 - 在代码中初始化
RtspServer。 - 将
Camera2的预览回调 (Preview) 直接连接到RtspServer。 - 调用
start()方法,服务器就启动了。
// 示例代码 val server = RtspServer(surfaceTexture, 1920, 1080, 30, "my_camera_stream") server.start(8554) // 8554 是 RTSP 端口
- 在
-
优点:
- 极其简单,纯 Java/Kotlin API,无需关心 JNI/C++。
- 开箱即用,非常适合快速原型开发和商业项目。
- 通常支持硬编码,性能较好。
-
缺点:
- 灵活性相对较低,定制化不如 FFmpeg 或 Live555。
- 依赖社区维护,如果项目停止更新可能会有风险。
使用 GStreamer
GStreamer 是一个基于管道的多媒体框架,非常灵活和强大。
-
工作流程:
- 创建一个 GStreamer 管道。
- 管道的源是 Android 的摄像头(通过
androidcamerasrc元素)。 - 中间是编码器(
h264enc)和封装器(rtspclientsink)。 - 将这些元素连接起来,然后启动管道。
# 管道描述示例 androidcamerasrc ! videoconvert ! h264enc ! rtspclientsink location=rtsp://192.168.1.100:8554/live
-
优点:
- 极高的灵活性和可扩展性,可以构建复杂的媒体处理流程。
- 优秀的跨平台支持。
-
缺点:
- 学习曲线陡峭。
- 需要集成 GStreamer 的 Android SDK,体积较大。
- 配置管道对于新手来说很困难。
方案对比与选择建议
| 方案 | 易用性 | 性能 | 灵活性 | 集成复杂度 | 推荐场景 |
|---|---|---|---|---|---|
| Android-Camera2RTSP | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐ | 快速开发、原型验证、对性能要求不极致的商业项目 |
| FFmpeg + librtsp | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 需要支持多种编解码格式、协议,功能要求极高的专业应用 |
| Live555 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | 需要精细控制 RTP 流,追求稳定性和轻量级的项目 |
| GStreamer | ⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | 需要构建复杂媒体处理流水线,有流媒体处理经验的专业团队 |
选择建议:
- 如果你是初学者,或者想尽快完成一个 Demo 或 MVP(最小可行产品):强烈推荐
Android-Camera2RTSP,它能让你在几分钟内就让 RTSP 服务器跑起来。 - 如果你是开发者,需要高度定制化,或者项目对性能、格式支持有严格要求:选择
FFmpeg,虽然前期投入大,但后期能力无限。 - 如果你需要一个轻量级、稳定可靠的 RTSP 服务器,并且愿意自己处理一些底层逻辑:选择
Live555。
一个简单的实现步骤(以 Android-Camera2RTSP 为例)
-
添加依赖: 在你的
app/build.gradle文件中添加:dependencies { implementation 'com.pedro.library:rtplibrary:2.1.2' // 请使用最新版本 } -
添加权限: 在
AndroidManifest.xml中添加必要的权限:<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-
布局文件: 添加一个
SurfaceView或TextureView来显示摄像头预览。<TextureView android:id="@+id/textureView" android:layout_width="match_parent" android:layout_height="match_parent" /> -
Java/Kotlin 代码:
import android.Manifest import android.content.pm.PackageManager import android.graphics.SurfaceTexture import android.os.Bundle import android.util.Size import android.view.TextureView import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import com.pedro.rtplibrary.RtspServer com.pedro.rtplibrary.base.Camera2Base class MainActivity : AppCompatActivity() { private lateinit var textureView: TextureView private lateinit var rtspServer: RtspServer private val REQUEST_CODE_PERMISSIONS = 101 private val REQUIRED_PERMISSIONS = arrayOf( Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) textureView = findViewById(R.id.textureView) if (!allPermissionsGranted()) { ActivityCompat.requestPermissions( this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS ) } else { startServer() } } private fun startServer() { // 1. 初始化 RtspServer rtspServer = RtspServer(this) // 2. 设置回调,当 SurfaceView 准备好后开始预览和推流 textureView.surfaceTextureListener = object : TextureView.SurfaceTextureListener { override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) { // 3. 开始预览 rtspServer.startPreview(surface, Size(1920, 1080)) // 4. 启动 RTSP 服务器 rtspServer.start(8554) // 默认端口 8554 rtspServer.setStreamName("live") // 设置流名称 } // 其他回调方法... override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {} override fun onSurfaceTextureDestroyed(surface: SurfaceTexture): Boolean = true override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {} } } private fun allPermissionsGranted(): Boolean { return REQUIRED_PERMISSIONS.all { ActivityCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == REQUEST_CODE_PERMISSIONS) { if (allPermissionsGranted()) { startServer() } else { // 处理权限被拒绝的情况 } } } override fun onDestroy() { super.onDestroy() rtspServer.stop() // 一定要在销毁时停止服务器 } } -
如何测试:
- 在同一 Wi-Fi 网络下的另一台设备(如电脑、另一台手机)上打开 VLC 播放器。
- 在 VLC 中选择 "媒体" -> "打开网络串流"。
- 输入 URL:
rtsp://<你的Android设备IP>:8554/live - 点击播放,你应该就能看到 Android 设备摄像头实时传来的画面了。
重要注意事项
- 性能与功耗: 持续进行视频编码和网络传输会非常消耗 CPU 和电量,并导致设备发热,对于长时间运行的应用,需要做好性能优化和电量管理。
- 网络要求: RTSP 对网络质量有一定要求,在弱网环境下,画面可能会卡顿或中断,可以考虑使用
SRS(Simple RTMP Server) 或Ant Media Server等专业流媒体服务器来做中转和协议转换,它们支持更强大的 CDN 和抗弱网能力。 - 安全: 默认情况下,RTSP 服务器没有加密,容易被窃听,如果数据敏感,可以考虑使用 RTSPS (RTSP over TLS) 或使用 WebRTC(通过 SFU/TURN 服务器)进行端到端加密传输。
- Android 版本:
Camera2API 是从 Android 5.0 (Lollipop) 开始引入的,如果你的应用需要支持更低版本,需要使用旧的CameraAPI,实现会更复杂。
希望这份详细的指南能帮助你理解和在 Android 上实现 RTSP 服务器!
