# RTSP **Repository Path**: AndroidCoderPeng/RTSP ## Basic Information - **Project Name**: RTSP - **Description**: RTSP协议推流 - **Primary Language**: Kotlin - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2025-12-13 - **Last Updated**: 2025-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Android平台(Java/Kotlin/C++)音视频推流流程说明 ## 1. 初始化 RTSP 参数 - 配置以下参数: - IP 地址 - 端口(Port) - 视频宽度(Width) - 视频高度(Height) - 码率(Bitrate) - 记录程序启动时的微秒级时间戳(即 `System.nanoTime() / 1000`)作为后续音视频帧时间戳的基准。 ## 2. 视频采集与编码 - 使用 **Camera1 API** 采集视频画面,获取 **YUV (NV21)** 格式原始数据(通常为25fps); - 将 **NV21 转换为 NV12**(适配硬件编码器输入格式); - 通过硬件编码器生成完整的 **H.264 帧数据**,必须包含起始码(Start Code: `0x00000001`); > ⚠️ **关键提示**:H.264 帧不能缺少起始码,且不能按照起始码分割为 NALU,否则 FFmpeg 无法正确解析,将导致推流无画面! - 记录每帧编码完成时的时间戳(单位:微秒),相对于步骤 1 中的起始时间。 ## 3. SPS/PPS 初始化媒体复用器 - 通过 **JNI 将 H.264 帧数据** 传递至 Native 层; - 在 Native 层 提取 **SPS/PPS** 帧数据并初始化媒体复用器; > ⚠️ **关键提示**:必须在发送任何视频帧前完成复用器初始化,否则推流将无画面! ## 4. 音频采集 - 使用 **AudioRecord** 采集原始 **PCM 裸流**(通常为 16-bit、单声道、8000Hz); - 同样记录每帧音频数据的时间戳(单位:微秒),相对于步骤 1 中的起始时间。 ## 5. 音频编码 - 通过 **JNI** 将 PCM 数据传递至 Native 层; - 在 Native 层将 PCM 编码为 **G.711 μ-law** 格式。 ## 6. 时间戳转换 - 使用 **FFmpeg** 对音视频时间戳进行时钟域转换: - **视频时间戳**:从微秒 → **90kHz 时钟域**; - **音频时间戳**:从微秒 → **8000Hz 时钟域**; ## 7. 封装与推流 - 使用 **FFmpeg** 分别对以下数据进行封装: - 带起始码的完整 H.264 帧(视频流) - G.711 μ-law 编码后的音频帧(音频流) - 将封装后的音视频流推送至流媒体服务器(FFmpeg自带推流功能)。 ## 注意:Android平台需要根据不同的设备平台交叉编译 FFmpeg ,编译好之后再在 CMakeLists.txt 和 JNI 桥接函数中 引入。