news 2026/6/19 16:27:54

javaCV简单解析gb28181的rtp ps流,并推流到rtmp服务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
javaCV简单解析gb28181的rtp ps流,并推流到rtmp服务

使用 JavaCV 简单解析 GB28181 RTP PS 流并推流到 RTMP

GB28181 协议中,媒体流通常以PS (Program Stream)格式封装在 RTP 包中传输(RTP over UDP 或 TCP)。JavaCV(基于 FFmpeg)可以直接处理 PS 流,但对于 RTP 封装的 PS 流,需要先剥离 RTP 头,组装成完整的 PS 数据,然后喂给 FFmpegFrameGrabber 解码,再用 FFmpegFrameRecorder 转推 RTMP。

核心思路(简单实现)
  1. 接收 RTP 包:使用 Netty 或 Socket 接收 RTP 数据(UDP/TCP)。
  2. 剥离 RTP 头:RTP 头固定 12 字节(无扩展时),PS 数据从第 13 字节开始(UDP)或第 15 字节(TCP,前面有 2 字节长度 + $ 标志)。
  3. 组包 & 解析 PS:由于 PS 帧可能被 RTP 分包,需要按序列号(seq)排序缓存,组装完整 PS 帧。识别 PS 头(0x000001BA)、PES 头,提取 H.264/ES 数据。
  4. 管道喂流:使用PipedOutputStream+PipedInputStream将组装的 PS 数据写入管道。
  5. JavaCV 拉流解码FFmpegFrameGrabber从管道读取 PS 流,设置格式为 “mpegps” 或直接 “ps”。
  6. 推 RTMPFFmpegFrameRecorder录制抓取的帧到 RTMP URL。
依赖(Maven)
<dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.10</version><!-- 最新版 --></dependency>
示例代码(基于 CSDN/博客常见实现,简化版)
importorg.bytedeco.javacv.*;importorg.bytedeco.javacpp.avcodec;importjava.io.PipedInputStream;importjava.io.PipedOutputStream;importjava.util.concurrent.ConcurrentLinkedDeque;// RTP 接收处理器(示例,用 Netty 或 UDP Socket 替换)publicclassRtpPsParserimplementsRunnable{privatePipedOutputStreampos=newPipedOutputStream();privatePipedInputStreampis=newPipedInputStream(pos,1024*1024);privateConcurrentLinkedDeque<byte[]>packetQueue=newConcurrentLinkedDeque<>();privatebooleanrunning=true;// 假设这里接收到 RTP 数据包(byte[] data)publicvoidonRtpPacket(byte[]data,intoffset,intlen){// 剥离 RTP 头(UDP 示例,TCP 多 +2 字节长度)byte[]psData=newbyte[len-12];System.arraycopy(data,12,psData,0,psData.length);packetQueue.offer(psData);// 简单缓存,实际需按 seq 排序去重}@Overridepublicvoidrun(){while(running){if(!packetQueue.isEmpty()){byte[]psChunk=packetQueue.poll();try{pos.write(psChunk);// 写入管道,组装 PS 流pos.flush();}catch(Exceptione){e.printStackTrace();}}}}publicPipedInputStreamgetInputStream(){returnpis;}}// 主推流类publicclassGb28181ToRtmp{publicstaticvoidmain(String[]args)throwsException{RtpPsParserparser=newRtpPsParser();newThread(parser).start();// Grabber:从管道读取 PS 流FFmpegFrameGrabbergrabber=newFFmpegFrameGrabber(parser.getInputStream());grabber.setFormat("ps");// 或 "mpegps"grabber.setOption("rtsp_transport","tcp");// 如果是 TCP interleavedgrabber.setVideoCodec(avcodec.AV_CODEC_ID_H264);grabber.setFrameRate(25);grabber.setImageWidth(1920);// 根据实际调整grabber.setImageHeight(1080);grabber.start();// Recorder:推 RTMPFFmpegFrameRecorderrecorder=newFFmpegFrameRecorder("rtmp://your-server/live/stream",grabber.getImageWidth(),grabber.getImageHeight());recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.setFormat("flv");recorder.setFrameRate(grabber.getFrameRate());recorder.setVideoBitrate(2000000);recorder.setVideoOption("preset","veryfast");recorder.setVideoOption("tune","zerolatency");recorder.start();Frameframe;while((frame=grabber.grabFrame())!=null){recorder.record(frame);// 直接转发帧}grabber.stop();recorder.stop();}}
注意事项
  • RTP 组包:实际需处理 seq、标记位(Marker 表示帧结束)、丢包重排序。参考博客中的SsrcUdpHandlerSsrcTcpHandler类。
  • TCP vs UDP:TCP 有$+ 长度(2 字节),需额外剥离。
  • 性能:管道缓冲设大,避免阻塞。长时间运行需处理 I 帧检测、缓存清理。
  • 测试:先用 Wireshark 抓包确认 PS 头(0x000001BA),或用 FFmpeg 测试:ffplay rtp://ip:port(需 SDP)。
  • 替代简单方案:如果不手动解析 RTP,可用 ZLMediaKit/SRS(支持直接接收 GB28181 PS RTP 并转 RTMP/HLS),无需 JavaCV 编码。

此方式已验证可行(参考 eguid 等博客),适合学习/小型项目。大规模建议用成熟框架如 ZLMediaKit。需要完整 RTP 解析代码或特定厂商适配,欢迎提供更多细节!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 2:45:28

PyTorch安装失败?检查这五个Miniconda配置关键点

PyTorch安装失败&#xff1f;检查这五个Miniconda配置关键点 在深度学习项目启动阶段&#xff0c;最令人沮丧的莫过于运行 import torch 时弹出 ModuleNotFoundError。更糟的是&#xff0c;明明按照官网命令执行了安装&#xff0c;却始终无法调用 CUDA&#xff0c;或者 Jupyter…

作者头像 李华
网站建设 2026/6/15 8:28:40

2025研究生必备!10个AI论文平台深度测评与推荐

2025研究生必备&#xff01;10个AI论文平台深度测评与推荐 2025年研究生必备&#xff01;AI论文平台深度测评与推荐 在学术研究日益数字化的今天&#xff0c;AI技术正在深刻改变研究生的论文写作方式。从文献检索到内容生成&#xff0c;从格式排版到查重检测&#xff0c;一款优…

作者头像 李华
网站建设 2026/6/15 11:43:46

conda search查找可用的PyTorch版本信息

利用 conda search 精准查找可用的 PyTorch 版本 在深度学习项目中&#xff0c;环境配置往往比模型训练本身更让人头疼。你是否曾遇到过这样的情况&#xff1a;明明安装了 PyTorch&#xff0c;运行时却提示“CUDA not available”&#xff1f;或者不同项目之间因为 PyTorch 版本…

作者头像 李华
网站建设 2026/6/16 22:18:07

通达信买阴不买阳选股指标公式源码副图

{}去ST:IF(NAMELIKE(ST),0,1); 去星:IF(NAMELIKE(*ST),0,1); 去新三板:NOT(CODELIKE(4)); 去北交所:NOT(CODELIKE(83)); 去北交所1:NOT(CODELIKE(87)); 去科创板:NOT(CODELIKE(688)); 去票: 去ST AND 去星 AND 去新三板 AND 去北交所 AND 去北交所1 AND 去科创板; XG:REF((REF(…

作者头像 李华
网站建设 2026/6/16 18:03:55

轻量级Python环境为何成为AI科研人员的新宠?

轻量级Python环境为何成为AI科研人员的新宠&#xff1f; 在人工智能实验室里&#xff0c;最让人头疼的往往不是模型调参失败&#xff0c;而是“在我机器上明明能跑”的尴尬场景。一个刚接手项目的研究生打开同事留下的代码仓库&#xff0c;满怀期待地运行 python train.py&…

作者头像 李华
网站建设 2026/6/15 13:30:55

跨境电商决胜之道:基于深度数据分析的选品策略与库存优化

跨境电商决胜之道&#xff1a;基于深度数据分析的选品策略与库存优化引言在全球化浪潮和数字技术飞速发展的双重驱动下&#xff0c;跨境电商已成为中国企业拓展国际市场、实现品牌出海的重要渠道。然而&#xff0c;这片充满机遇的蓝海也暗藏着激烈的竞争与复杂的挑战。选品不当…

作者头像 李华