博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node 版本 RTSP Server 开发心得
阅读量:4135 次
发布时间:2019-05-25

本文共 1200 字,大约阅读时间需要 4 分钟。

年后着手Node版本EasyDarwin的开发工作,截止到今天2018年03月27日上线了第一个版本,今天小米发布了MIX2S, 致敬! 致敬!

关于RTSP协议

目前这个第一版暂时仅支持RTSP Over TCP, 不过RTSP Over UDP也会很快实现.总体来说, RTSP协议比较简单.开发过程中对RTSP协议的理解主要参考了 这篇文章.sdp的解析一开始自己写的, 反复参考资料了解sdp各个字段的含义.后来偶然在npm上找到 这个库, 处理sdp信息非常方便, 果断star了.

记录sdp两个细节的地方:

  1. m 媒体描述下面有个属性名为 control 的属性, 它的值和后续 SETUP 请求的 uri 的尾巴是对应的, 椐此可以明确 SETUP 是音频还是视频.

  2. SETUP 携带的请求头 Transport 中有个参数叫 interleaved, 这个东西常见的内容是一个偶数-一个奇数, 这两个数值代表RTP传输的通道标识.一个RTP包前面有4个节字的头: 1个字节的固定$(0x24)符;1个字节通道标识;2个字节的RTP包长度.对应的正是这个头里面的第2个字节.一般偶数表示数据通道, 奇数表示控制通道.

理解以上两点, 有助于在RTP传输过程中, 针对特定的视频格式, 缓存GOP,实现秒开效果.

NodeJS效率问题

从TCP流式数据中解析RTP包, 对NodeJS的处理效率是个考验.在初始阶段, 简单的利用 socket data 事件回调, 只要接收到数据, 就走一次协议解析. 实测发现一路播放的情况下都很卡顿. 最后是参考了 中的 BufferPool 实现, 利用 Generator 和 yield. 只有当接收数据长度达到要求的时候, 才去做协议解析. 这样效率得到巨大提升, 播放不卡顿了. 中间还尝试过利用 socket pipe 将RTP包流转给播放端, 这样做确实效率很高, 也可以解决播放卡顿. 但是这种方式下, 解不到单个RTP包, 就无法做GOP缓存, 所以弃用了.

秒开实现

结合sdp中的媒体描述和 SETUP Transport interleaved 的值, 可以识别出一个RTP包携带的内容是媒体数据还是控制数据, 如果是媒体数据, 是音频还是视频, 如果是视频, 那么视频数据的编码格式是什么. 基于这些, 当收到携带h264数据的RTP包时, 做关键帧识别, 缓存GOP.

在RTP包中识别h264关键帧, 需要了解RTP包格式, h264 nalu type, fu-a 分包这些内容.这里我主要参考了CSDN上这篇博客

获取更多信息

安防流媒体互联直播-QQ交流群:

LiveGBS-QQ交流群:

WEB:

电话:187-0985-4855 (同微信)

Copyright © LiveQing.com 2016-2019

转载地址:http://rgvvi.baihongyu.com/

你可能感兴趣的文章
Android RecyclerView完全解析
查看>>
Java synchronized 详解
查看>>
Android自绘制控件
查看>>
Handler 机制(一)—— Handler的实现流程
查看>>
Java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)
查看>>
Android Studio常用配置
查看>>
Java内存管理机制
查看>>
[转]探索 Android 内存优化方法
查看>>
面向对象设计原则
查看>>
23种设计模式——创建型设计模式(5种)
查看>>
23种设计模式——结构型设计模式(7种)
查看>>
B2B、B2C、C2C、O2O等区分
查看>>
hadoop学习之hadoop完全分布式集群安装
查看>>
Hadoop的安装(伪分布式模式和分布式模式)
查看>>
Ubuntu 12.04搭建hadoop2.0.4单机版环境
查看>>
分布式计算开源框架Hadoop介绍
查看>>
Hadoop中的集群配置和使用技巧
查看>>
Hadoop基本流程与应用开发
查看>>
Hbase分布式的安装
查看>>
ubuntu linux下安装 hbase
查看>>