惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
Spread Privacy
Spread Privacy
P
Proofpoint News Feed
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MyScale Blog
MyScale Blog
T
Tor Project blog
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
P
Privacy & Cybersecurity Law Blog
MongoDB | Blog
MongoDB | Blog
Simon Willison's Weblog
Simon Willison's Weblog
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
小众软件
小众软件
G
GRAHAM CLULEY
P
Privacy International News Feed
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
人人都是产品经理
人人都是产品经理
S
Schneier on Security
Scott Helme
Scott Helme
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
E
Exploit-DB.com RSS Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
U
Unit 42
The Register - Security
The Register - Security
S
Securelist
Martin Fowler
Martin Fowler
Project Zero
Project Zero
大猫的无限游戏
大猫的无限游戏
Cisco Talos Blog
Cisco Talos Blog

博客园 - sheldon_blogs

Android上玩转TUN设备及rtsp传输 Android14 RK3588平台内核异常中断占用CPU问题排查 Android平台移植stress-ng工具及使用 Android OTA的两种方式:Non-A/B(recovery)和A/B系统升级 Android设备之间UVC Gadget bulk模式无法正常打开问题 Android的USB网络共享功能 Linux修改Swap分区大小及使用优先级 Android开放配件 (AOA) 协议 Android(S)系统属性服务详解 Android12 双屏异显/异触流程分析 Android Webview 调试总结 RK3588 Android12 编译打包私有ext4格式vendor.img并挂载到新增vendor_private分区 C++提取字符串中的整数 Android UVC Camera H.265帧序错乱问题 RK3588 Android12 一个固件兼容多个板型方案 全志A133 Android10 Display框架实践 Android编译脚本添加kernel编译选项传入宏定义 UAC实例分析-USB音响 Android USB之复合设备(gadget)详解
Android设备搭建本地RTSP服务器(基于live555)
sheldon_blogs · 2026-03-12 · via 博客园 - sheldon_blogs

一、RTSP协议简介

RTSP全称实时流协议(Real Time Streaming Protocol),它是一个网络控制协议,设计用于娱乐、会议系统中控制流媒体服务器。RTSP用于在希望通讯的两端建立并控制媒体会话,客户端通过发出VCR-style命令如play、record和pause等来实时控制媒体流。

RTSP处理流时会根据端点间可用带宽大小,将大数据切割成小分组,以使得客户端可以在播放一个分组的同时,可以解压第二个甚至同时下载第三个分组。这样一来,用户将不会感觉到数据间存在停顿。至于RTSP的特性,则主要体现在如下方面:

  1. 多服务器兼容 :媒体流可来自不同服务器
  2. 可协商 :客户端和服务器可协商feature支持程度
  3. HTTP亲和性 :尽可能重用HTTP概念,包括认证、状态码、解析等
  4. 易解析 :HTML或MIME解析器均可在RTSP中适用
  5. 易扩展 :新的方法或参数甚至协议本身均可添加或定制
  6. 防火墙亲和性 :传输层或应用层防火墙均可被协议较好处理
  7. 服务器控制 :控制概念易于理解,服务器不允许向客户端传输不能被客户端关闭的流
  8. 多场景适用 :RTSP提供帧级别精度,适用于更多媒体应用场景

RTSP组合使用了可靠传输协议TCP(控制)和高效传输协议UDP(内容)来串流内容给用户,即文件开始传输而客户端不用等待整个文件内容抵达就开始播放。其实不仅仅是点播服务,RTSP还支持传输不能以传统方式下载后播放的直播内容。

RTSP也并不负责数据传输,通常(非必须)是通过RTP(Real-time Transport Protocol)来完成,而RTP中,又通过RTCP负责完成同步、QOS管理等功能。具体应用中,它们三者的关系如下图所示:

image

RTSP:主要负责提供像播放、暂停、快进等操作,它负责定义具体的控制消息、操作方法、状态码等,此外还描述了与RTP间的交互操作。

RTP:传输音频/视频数据,如果是PLAY,Server发送到Client端,如果是RECORD,可以由Client发送到Server。整个RTP协议由两个密切相关的部分组成:RTP数据协议和RTP控制协议(RTCP)。

RTCP:服务质量的监视与反馈、媒体间的同步,以及多播组中成员的标识。在RTP会话期 间,各参与者周期性地传送RTCP包。RTCP包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料,因此,各参与者可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,它们能以有效的反馈和最小的开销使传输效率最佳化,因而特别适合传送网上的实时数据。

RTSP通信过程通常包括以下几个关键步骤:

  • OPTIONS :客户端向服务器发送OPTIONS请求,以查询服务器支持的方法。
  • DESCRIBE :客户端请求媒体描述信息,服务器返回SDP(Session Description Protocol)格式的描述。
  • SETUP :为媒体流建立传输参数,如传输协议(RTP/RTCP)、端口等。
  • PLAY :启动媒体流的播放,服务器开始发送RTP数据包。
  • TEARDOWN :结束会话,释放资源。

二、Live555库移植到Android平台

1.Live555简介:

  Live555库由多个核心模块组成,形成了一个完整的多媒体流媒体框架。其模块结构如下:

  • BasicUsageEnvironment :提供基本的运行环境支持,包括任务调度、事件处理等。
  • UsageEnvironment :扩展了BasicUsageEnvironment,支持更复杂的任务管理。
  • Groupsock :提供底层网络通信支持,包括UDP和TCP。
  • liveMedia :核心媒体处理模块,包含RTSP客户端/服务器、RTP封装/解析、媒体源处理等。
  • ProxyServerMediaSession :用于构建代理服务器,实现媒体流的转发。
  • RTSPServer :实现RTSP服务器端的功能,处理客户端的请求。
  • SimpleRTPSink :用于将媒体数据通过RTP协议发送到客户端。

2.移植步骤:

(1)源码下载:https://download.live555.com/
  注:需要使用到g++编译,提前安装:
  sudo apt install g++-aarch64-linux-gnu

  包括下载NDK: https://developer.android.google.cn/ndk/downloads?hl=cs 并解压到/opt/目录下,用于Android平台编译开源项目。
(2)增加对应平台的编译配置文件,例如复制config.armlinux一份命名为 config.aarch64-linux-gnu

  修改其交叉编译工具为aarch64-linux-gnu-xx,当前不需要在 RTSP 通信中使用 SSL/TLS 加密功能,可以先禁用掉:

  COMPILE_OPTS编译选项中添加:-DNO_OPENSSL=1 并清除 LIBS_FOR_CONSOLE_APPLICATION = -lssl -lcrypto 的依赖
  另外Android NDK 工具链(通常是 GCC 或基于 LLVM 的 clang)的 C++ 标准库版本较旧,不支持这个 C++20 特性,禁用 C++ 标准库中的新特性:
  COMPILE_OPTS编译选项中添加:-DNO_STD_LIB=1

  完整的config.aarch64-linux-gnu配置文件内容:

# 定义 NDK 路径和工具链
NDK_PATH = /opt/android-ndk/android-ndk-r27d
TOOLCHAIN = $(NDK_PATH)/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT = $(TOOLCHAIN)/sysroot
API_LEVEL = 31

# 交叉编译前缀(clang 的用法稍有不同,直接指定编译器全名)
CROSS_COMPILE = $(TOOLCHAIN)/bin/aarch64-linux-android$(API_LEVEL)-

# 编译选项:移除 -I/usr/local/include,添加 sysroot 和必要的宏
COMPILE_OPTS = $(INCLUDES) -I$(SYSROOT)/usr/include -I. -O2 \
               -DSOCKLEN_T=socklen_t \
               -DNO_SSTREAM=1 -DNO_OPENSSL=1 -DNO_STD_LIB=1 \
               -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 \
               --sysroot=$(SYSROOT)

C = c
C_COMPILER = $(CROSS_COMPILE)clang
C_FLAGS = $(COMPILE_OPTS)
CPP = cpp
CPLUSPLUS_COMPILER = $(CROSS_COMPILE)clang++
CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -Wall -DBSD=1
OBJ = o
LINK = $(CROSS_COMPILE)clang++ -o
LINK_OPTS = -static-libstdc++   # 静态链接 C++ 库,避免依赖 libc++_shared.so
CONSOLE_LINK_OPTS = $(LINK_OPTS)
LIBRARY_LINK = $(TOOLCHAIN)/bin/llvm-ar cr 
LIBRARY_LINK_OPTS =
LIB_SUFFIX = a
LIBS_FOR_GUI_APPLICATION =
EXE =

(3)通过配置文件生成编译脚本:
  ./genMakefiles aarch64-linux-gnu
  如果运行报错:bash: ./genMakefiles: cannot execute: required file not found
  需要转换下文件格式(其他开源项目移植也要注意文件格式问题):  dos2unix genMakefiles
(4)生成Makefile后就可以执行 make 编译得到如下静态库,再把对应模块的头文件拷贝出来引用即可:

./BasicUsageEnvironment/libBasicUsageEnvironment.a
./groupsock/libgroupsock.a
./liveMedia/libliveMedia.a
./UsageEnvironment/libUsageEnvironment.a

三、移植H.264视频编码器(x264)

1.x264简介:

 H.264 是视频编码标准 , 由 ITU 和 MPEG 制订,而x264 是 H.264 格式的视频编解码库 , 由 C 语言实现 ;

2.移植步骤:

(1)下载x264源码:https://www.videolan.org/developers/x264.html ,解压后增加编译脚本build.sh:

#!/bin/bash

NDK=/opt/android-ndk/android-ndk-r27d
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
TARGET=aarch64-linux-android
API=31

export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export AR=$TOOLCHAIN/bin/llvm-ar
export AS=$TOOLCHAIN/bin/llvm-as
export LD=$TOOLCHAIN/bin/ld.lld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip

./configure \
--prefix=$(pwd)/android-build \
--host=$TARGET \
--sysroot=$TOOLCHAIN/sysroot \
--enable-static \
--enable-pic \
--disable-cli \
--disable-asm \
--extra-cflags="-fPIC -DANDROID" \
--extra-ldflags="-L$TOOLCHAIN/sysroot/usr/lib/$TARGET/$API"

make -j8
make install
echo "编译完成,输出目录:$(pwd)/android-build"

(3)执行build.sh后,得到对应静态库和头文件生成在android-build目录:
├── include
│   ├── x264_config.h
│   └── x264.h
└── lib
├── libx264.a

 拷贝静态库和头文件出来引用即可。

四、移植三方开源rtsp server应用项目到Android平台

前面移植的live555、x264静态库就是为rtsp server应用所准备,按以下步骤将github上已有的开源项目适配Android平台:

(1)下载源码:https://github.com/xujie10101/liveRtspServer
(2)将之前编译得到的live555和x264静态库合入liveRtspServer源码
(3)适配Android原生的libtinyalsa来替代alsa-lib,用原生的libFraunhoferAAC来代替faac
(4)编写对应Android.bp,用于编译生成liveRtspServer可执行程序。

编译生成的 liveRtspServer 在RK3588s2 Android12平台运行效果:

RK3588s2:/ # liveRtspServer -v /dev/video20 -p 1234
video device: /dev/video20
port: 1234
Play this stream using the URL "rtsp://192.168.3.149:1234/live"
x264 [info]: using cpu capabilities: none!
x264 [info]: profile High 4:2:2, level 4.0, 4:2:2, 8-bit
x264 [info]: frame I:1     Avg QP:24.54  size: 59831
x264 [info]: frame P:1     Avg QP:23.89  size: 43090
x264 [info]: mb I  I16..4: 18.5% 72.2%  9.2%
x264 [info]: mb P  I16..4: 17.7% 38.0%  1.6%  P16..4: 28.6%  9.2%  2.6%  0.0%  0.0%    skip: 2.3%
x264 [info]: 8x8 transform intra:70.1% inter:80.6%
x264 [info]: coded y,uvDC,uvAC intra: 37.1% 84.4% 18.3% inter: 49.6% 89.6% 2.1%
x264 [info]: i16 v,h,dc,p: 32% 16%  9% 43%
x264 [info]: i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 28% 12% 23%  5%  7% 10%  6%  5%  4%
x264 [info]: i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 34% 12% 10%  5% 13% 11%  9%  4%  3%
x264 [info]: i8c dc,h,v,p: 49% 18% 26%  7%
x264 [info]: Weighted P-Frames: Y:100.0% UV:100.0%
x264 [info]: kb/s:12350.52
x264 [info]: using cpu capabilities: none!
x264 [info]: profile High 4:2:2, level 4.0, 4:2:2, 8-bit

image

目前只跑通测试了视频流,RK3588平台抓usb camera数据编码1080p h264传输只有5fps,需要移植类似ffmpeg支持硬件编码的库来替换x264,以提升码率。

另外多播还未跑通,以及音频需进一步调试。

适配Android的 liveRtspServer 工程已上传到github  : git clone git@github.com:dragonforgithub/liveRtspServer.git