FFmpeg实现RTSP推拉流
RTSPReal Time Streaming Protocol推流与拉流的实现核心在于建立符合RTSP/RTP/RTCP协议栈的客户端与服务器。以下是基于不同场景和工具的实现方法。一、 使用现成服务器与工具快速验证这是最快捷的方式适用于功能验证和简单应用。1. 推流实现推流指将本地视频源文件、摄像头、屏幕发布到RTSP服务器。工具/组件推流命令/方法示例说明FFmpegffmpeg -re -i input.mp4 -c copy -f rtsp rtsp://server_ip:port/live/stream将本地文件以原始编码-c copy推流到RTSP服务器。-re表示按输入文件速率读取。FFmpeg (摄像头)ffmpeg -f dshow -i videoUSB Camera -vcodec libx264 -f rtsp rtsp://server_ip:port/live/stream(Windows)ffmpeg -f v4l2 -i /dev/video0 -vcodec libx264 -f rtsp rtsp://server_ip:port/live/stream(Linux)捕获USB摄像头视频编码为H.264后推流。GStreamergst-launch-1.0 v4l2src ! videoconvert ! x264enc ! rtspclientsink locationrtsp://server_ip:port/live/stream使用GStreamer管道从V4L2设备采集、编码并推流。OpenCV VideoWriterpythonout cv2.VideoWriter(appsrc ! videoconvert ! x264enc ! rtspclientsink locationrtsp://...,cv2.CAP_GSTREAMER, 0, fps, (width, height))#### 2. 拉流实现 拉流指从RTSP服务器获取并播放或处理视频流。 | 工具/组件 | 拉流命令/方法示例 | 说明 | | :--- | :--- | :--- | | **FFplay (FFmpeg)** | ffplay rtsp://server_ip:port/live/stream | 最简单的拉流播放工具。 | | **VLC Media Player** | 媒体 - 打开网络串流 - 输入RTSP URL | 图形化工具支持拉流播放。 | | **OpenCV VideoCapture** | pythonbrcap cv2.VideoCapture(rtsp://server_ip:port/live/stream)brwhile cap.isOpened():br ret, frame cap.read()br # 处理framebr | 在Python中拉流并获取每一帧图像进行处理。 | | **GStreamer** | gst-launch-1.0 rtspsrc locationrtsp://server_ip:port/live/stream ! decodebin ! autovideosink | 使用GStreamer管道拉流并解码显示。 | #### 3. 轻量级RTSP服务器 进行推拉流测试需要一个RTSP服务器。**mediamtx**原rtsp-simple-server是一个极简的选择。 1. **下载并启动服务器** bash # 从 https://github.com/bluenviron/mediamtx/releases 下载对应平台版本 ./mediamtx 服务器默认在 :8554 端口监听。 2. **推流到服务器** bash ffmpeg -re -i input.mp4 -c copy -f rtsp rtsp://localhost:8554/mystream 3. **从服务器拉流** bash ffplay rtsp://localhost:8554/mystream ### 二、 编程实现C/C示例 对于嵌入式或需要深度集成的场景需要编程实现RTSP客户端/服务器。 #### 1. RTSP推流客户端实现要点 一个基本的RTSP推流客户端需要完成以下步骤 c // 伪代码流程1. 建立TCP连接至RTSP服务器默认端口554。 2. 发送DESCRIBE请求获取媒体描述SDP。 3. 发送SETUP请求为音视频流建立传输通道RTP/RTCP端口。 4. 发送PLAY请求开始播放。 // 对于推流ANNOUNCE, RECORD服务器需支持相关方法。 5. 在SETUP建立的UDP或TCP套接字上按照RTP协议封装并发送音视频数据。 将H.264 NALU封装为RTP包。一个NALU可能被分片FU-A或打包成单个RTP包。 RTP头需设置序列号、时间戳、负载类型等。 6. 周期性发送RTCP接收报告RR或发送报告SR。关键代码片段RTP封装H.264 NALU// 假设有一个H.264 NALU (nal_data, nal_len)需要封装为RTP包 void send_rtp_h264_packet(int rtp_sock, struct sockaddr_in *dest_addr, const uint8_t *nal_data, int nal_len, uint16_t *seq_num, uint32_t *timestamp) { uint8_t rtp_packet[1500]; // MTU大小 int rtp_header_len 12; // 1. 构建RTP头 (RFC 3550) rtp_packet[0] 0x80; // V2, P0, X0, CC0 rtp_packet[1] 96; // PT96 (动态负载类型H.264常用) rtp_packet[2] (*seq_num 8) 0xFF; rtp_packet[3] *seq_num 0xFF; (*seq_num); // 设置时间戳 (根据时钟频率递增H.264视频通常为90000 Hz) rtp_packet[4] (*timestamp 24) 0xFF; rtp_packet[5] (*timestamp 16) 0xFF; rtp_packet[6] (*timestamp 8) 0xFF; rtp_packet[7] *timestamp 0xFF; // SSRC等字段省略... // 2. 封装H.264负载 (根据RFC 6184) if (nal_len 1400) { // 单包模式 (Single NALU) memcpy(rtp_packet rtp_header_len, nal_data, nal_len); send_packet(rtp_sock, dest_addr, rtp_packet, rtp_header_len nal_len); } else { // 分片模式 (FU-A) // FU indicator rtp_packet[rtp_header_len] (nal_data[0] 0xE0) | 28; // FU-A type28 // FU header (S|E|R) NALU type int offset 1; // 跳过NALU头 int remaining nal_len - offset; int max_payload_size 1400; int start 1; while (remaining 0) { int payload_size (remaining max_payload_size) ? max_payload_size : remaining; rtp_packet[rtp_header_len 1] (start ? 0x80 : 0x00) | // Start bit ((remaining payload_size 0) ? 0x40 : 0x00) | // End bit (nal_data[0] 0x1F); // NALU type memcpy(rtp_packet rtp_header_len 2, nal_data offset, payload_size); send_packet(rtp_sock, dest_addr, rtp_packet, rtp_header_len 2 payload_size); offset payload_size; remaining - payload_size; start 0; } } }2. RTSP拉流客户端实现要点拉流客户端与推流客户端步骤1-4类似区别在于第5步是接收并解析RTP包重组H.264 NALU。// 伪代码流程 (接收端) 14. 同推流客户端建立RTSP会话。 5. 在SETUP建立的UDP或TCP套接字上循环接收RTP包。 6. 解析RTP头获取序列号、时间戳、负载类型。 7. 根据RFC 6184解析H.264负载 单包模式直接提取NALU。 - FU-A分片模式缓存分片根据起始和结束标记重组完整的NALU。 8. 将重组后的NALU送入解码器如FFmpeg、硬件解码器或进行其他处理。关键代码片段解析RTP并重组H.264typedef struct { uint8_t buffer[MAX_NALU_SIZE]; int size; uint16_t seq; // 期望的下一个序列号 uint32_t timestamp; int fu_a_started; } NaluAssembler; void process_rtp_packet(NaluAssembler *assembler, const uint8_t *rtp_packet, int packet_len) { // 解析RTP头 int payload_type rtp_packet[1] 0x7F; uint16_t seq_num (rtp_packet[2] 8) | rtp_packet[3]; uint32_t timestamp (rtp_packet[4] 24) | (rtp_packet[5] 16) | (rtp_packet[6] 8) | rtp_packet[7]; const uint8_t *payload rtp_packet 12; // 假设无CSRC int payload_size packet_len - 12; if (payload_type ! 96) return; // 非H.264负载 uint8_t nal_unit_type payload[0] 0x1F; if (nal_unit_type 1 nal_unit_type 23) { // 单包NALU deliver_nalu(payload, payload_size, timestamp); } else if (nal_unit_type 28) { // FU-A uint8_t fu_header payload[1]; int start_bit (fu_header 7) 1; int end_bit (fu_header 6) 1; uint8_t reconstructed_nal_type fu_header 0x1F; if (start_bit) { // 开始分片 assembler-size 0; assembler-timestamp timestamp; assembler-fu_a_started 1; // 重组NALU头 assembler-buffer[0] (payload[0] 0xE0) | reconstructed_nal_type; assembler-size 1; } if (assembler-fu_a_started assembler-timestamp timestamp) { // 追加分片数据 memcpy(assembler-buffer assembler-size, payload 2, payload_size2); assembler-size (payload_size - 2); } if (end_bit assembler-fu_a_started assembler-timestamp timestamp) { // 分片结束交付完整NALU deliver_nalu(assembler-buffer, assembler-size, timestamp); assembler-fu_a_started 0; } } // 处理其他类型如STAP-A, MTAP16等 }三、 特定平台实现Android屏幕推流在Android上实现屏幕推流到RTSP服务器涉及屏幕捕获、编码和网络传输。// 核心步骤摘要 // 1. 获取MediaProjection权限创建VirtualDisplay捕获屏幕 MediaProjectionManager projectionManager (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE); Intent captureIntent projectionManager.createScreenCaptureIntent(); startActivityForResult(captureIntent, REQUEST_CODE); // 在onActivityResult中 MediaProjection mediaProjection projectionManager.getMediaProjection(resultCode, data); // 配置视频尺寸、DPI等 VirtualDisplay virtualDisplay mediaProjection.createVirtualDisplay(ScreenCapture, width, height, dpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, surface, null, null); // 2. 配置MediaCodec进行硬件编码H.264 MediaFormat format MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, width, height); format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate); format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate); format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval); format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface); MediaCodec encoder MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC); encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); Surface inputSurface encoder.createInputSurface(); encoder.start(); // 将VirtualDisplay的surface设置为编码器的inputSurface // virtualDisplay mediaProjection.createVirtualDisplay(..., inputSurface, ...); // 3. 从MediaCodec输出缓冲区获取编码后的H.264数据 MediaCodec.BufferInfo bufferInfo new MediaCodec.BufferInfo(); int outputBufferId encoder.dequeueOutputBuffer(bufferInfo, timeoutUs); if (outputBufferId 0) { ByteBuffer outputBuffer encoder.getOutputBuffer(outputBufferId); byte[] encodedData new byte[bufferInfo.size]; outputBuffer.get(encodedData); // 4. 将encodedDataH.264 NALU通过RTP协议发送至RTSP服务器 //需要实现RTSP客户端协议栈及RTP打包逻辑如第二部分所述 sendRtpPacket(encodedData, bufferInfo.presentationTimeUs); encoder.releaseOutputBuffer(outputBufferId, false); }四、 推拉流与AI处理结合常见场景是拉流-AI推理-推流。import cv2 import subprocess import threading # 1. RTSP拉流 rtsp_pull_url rtsp://server_ip:port/input_stream cap cv2.VideoCapture(rtsp_pull_url) # 2. 准备RTSP推流管道 (使用FFmpeg) rtsp_push_url rtsp://server_ip:port/output_stream command [ffmpeg, -y, -f, rawvideo, -vcodec, rawvideo, -pix_fmt, bgr24, -s, {}x{}.format(width, height), -r, str(fps), -i, -, -c:v, libx264, -pix_fmt, yuv420p, -preset, ultrafast, -f, rtsp, rtsp_push_url] p subprocess.Popen(command, stdinsubprocess.PIPE) while cap.isOpened(): ret, frame cap.read() if not ret: break # 3. AI推理处理 (例如YOLOv8) # results model(frame) # processed_frame plot_boxes(frame, results) processed_frame frame # 此处省略推理步骤 # 4.将处理后的帧推流 p.stdin.write(processed_frame.tobytes()) cap.release() p.stdin.close() p.wait()实现关键点总结协议理解必须理解RTSP信令控制、RTP数据传输、RTCP传输控制协议交互过程。数据封装视频编码数据如H.264 NALU需要按照RFC 6184规范封装成RTP包。注意NALU分片FU-A与组合。格式兼容确保推流端输出的H.264码流格式AVCC或Annex-B与接收端或服务器期望的格式匹配。例如某些解码器可能只支持Annex-B格式。网络适应处理网络抖动、丢包。使用RTCP进行QoS反馈必要时实现丢包重传或前向纠错。性能优化对于高帧率、高分辨率视频采用硬件编解码、多线程处理、零拷贝等技术降低延迟和CPU占用。参考来源h264 NAL解析代码实现rtsp推流拉流的方法(自己总结)Windows、linux一台电脑rtsp推流另一台拉流显示RTMP推流组件EasyRTMP实现内网摄像头RTSP拉流转码RTMP推流到RTMP服务器之Android版屏幕推流方法及其注意点RTMP推流组件EasyRTMP实现内网摄像头RTSP拉流转码RTMP推流到RTMP服务器之Android版屏幕推流方法及其注意点rtsp拉流yolov8推理rtsp推流

相关新闻

python项目管理器uv的安装和基本命令使用合集 - python的管理与使用

python项目管理器uv的安装和基本命令使用合集 - python的管理与使用

python项目管理器uv的安装和基本命令使用合集 - python的管理与使用1. 首先安装uv2.识别uv命令3.切换到另一版本4.总结1.python项目管理器uv的安装和基本命令使用1. 首先安装uv 终端中执行 powershell -ExecutionPolicy ByPass -c “irm https://astral.sh/uv/install.ps1 | i…

2026/8/2 18:42:50 阅读更多 →
智能优化算法改进策略:从通用工具到工程难题的精准求解

智能优化算法改进策略:从通用工具到工程难题的精准求解

1. 项目概述:从“能用”到“好用”的智能优化算法进阶之路 在工业设计、工程优化和复杂系统求解的领域里,我们常常会遇到一些“硬骨头”问题:比如如何设计一个散热效率最高的异形散热片结构,或者如何为一个形状极其复杂的铸件找到…

2026/8/4 7:30:18 阅读更多 →
CNN-LSTM模型在煤矿瓦斯浓度预测中的实战应用

CNN-LSTM模型在煤矿瓦斯浓度预测中的实战应用

1. 项目概述:当深度学习遇上煤矿安全 在煤矿、隧道等地下工程领域,瓦斯浓度监测是保障安全生产的生命线。传统的监测方式依赖于固定传感器,数据是孤立的点,预警往往滞后。这几年,我一直在琢磨,能不能用更“…

2026/8/4 6:04:33 阅读更多 →

最新新闻

深度解析:如何用OBS背景移除插件打造专业级虚拟演播室

深度解析:如何用OBS背景移除插件打造专业级虚拟演播室

深度解析:如何用OBS背景移除插件打造专业级虚拟演播室 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项目地址: https://…

2026/8/4 15:19:46 阅读更多 →
2026武汉爱采购开户服务类型盘点及正规服务商选择指南

2026武汉爱采购开户服务类型盘点及正规服务商选择指南

本文针对武汉本地有百度爱采购开户需求的企业,全面梳理当前主流服务类型、正规服务商筛选维度、本地服务商对比、避坑指南及开户流程,为企业选型提供客观参考。本文适配B2B工厂、科创企业、本地门店、招商加盟品牌、跨境企业等多类主体的开户需求&#x…

2026/8/4 15:19:46 阅读更多 →
Loop:5分钟掌握Mac窗口管理的终极免费方案

Loop:5分钟掌握Mac窗口管理的终极免费方案

Loop:5分钟掌握Mac窗口管理的终极免费方案 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop Loop是一款完全免费开源的macOS窗口管理工具,通过创新的径向菜单设计和智能快捷键系统…

2026/8/4 15:19:46 阅读更多 →
企业钓鱼攻击防御:从技术对抗到行为风险建模

企业钓鱼攻击防御:从技术对抗到行为风险建模

1. 项目背景与核心挑战最近三年接触过47家企业的安全团队,发现一个共性现象:90%以上的成功入侵都始于钓鱼攻击。某制造业上市公司安全总监告诉我:"我们每年投入百万级预算在防火墙和EDR上,但员工点开一封伪装成CEO邮件的钓鱼…

2026/8/4 15:19:46 阅读更多 →
工装外墙美学设计!仿石材铝单板逼真肌理超耐看

工装外墙美学设计!仿石材铝单板逼真肌理超耐看

做工程最怕什么?不是工期紧,而是选材失误带来的连锁噩梦。尤其是外墙幕墙,以前总觉得天然石材有面子,但真经历过一次项目后,我彻底改观了。今天不吹不黑,从工程人最关心的造价、安全、耐用、施工四个维度&a…

2026/8/4 15:19:46 阅读更多 →
PX4悬停控制技术深度解析:从基础原理到实战优化的完整指南

PX4悬停控制技术深度解析:从基础原理到实战优化的完整指南

PX4悬停控制技术深度解析:从基础原理到实战优化的完整指南 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot 多旋翼无人机悬停控制是飞行控制系统中最核心的技术挑战之一。在PX4开源飞控系…

2026/8/4 15:18:46 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →