背景

当存在一个推流客户端正在向rtmp://xxx.com/live/yyy推流时,又有另外一个推流客户端同时对这个地址进行推流,会发生什么呢?

查阅了 Adobe RTMP Spec 发现规范本身并未说明和定义这个场景下RTMP服务器应该怎么处理。

最近在实际工作中遇到部分客户对推流地址资源管理不恰当而导致重复推流报错的问题,且在查问题的过程中发现各个CDN厂商对“抢流”的处理各不相同,查阅相关文档说明发现资料甚少,故专门对它们的抢流行为做如下分析。

步骤

  1. 打开Wireshark捕获网卡,过滤规则:tcp && tcp.port == 1935 (之所以不直接写rtmpt是因为还想观察传输层的行为)
  2. 获取对应厂商的推拉流URL,假设推流地址是:rtmp://xxx.com/live/yyy
  3. 使用ffmpeg推送一个本地电影文件:ffmpeg -re -i Movie-1.flv -vcodec h264 -f flv "rtmp://xxx.com/live/yyy"
  4. 使用另一个ffmpeg推送另一个本地电影文件到同个URL:ffmpeg -re -i Movie-2.flv -vcodec h264 -f flv "rtmp://xxx.com/live/yyy"
  5. 使用ffplay播放拉流地址内容
  6. 观察现象并分析Wireshark抓包结果

厂商

数据

注:下列结果仅代表发表本文的时候的各CDN厂家行为,随着厂商对服务器的更新迭代,可能会有所改变。

厂商 现象 结论 官方文档说明 与文档描述一致
网宿 二次推流报错,ffplay拉流播放的是Movie-1内容 抓包分析发现第二次推流的RTMP连接能握手成功,但是publish()请求发出之后服务器应答onStatus('NetStream.Publish.BadName')(见参考文档) 直播推流与拉流
阿里云 二次推流报错,ffplay拉流播放的是Movie-1内容 抓包分析发现第二次推流的RTMP连接能握手成功,但是推流几秒之后CDN服务器会发来TCP RST包强制断开RTMP的TCP连接 未找到
腾讯云 二次推流成功,ffplay拉流播放的是Movie-1内容
关闭第一个推流的程序,播放内容变成Movie-2的内容
官方文档表明会拒绝第二个推流请求,但是实际实验下来竟然是可以重复推且不报错,不知道腾讯云这么实现有没有其他用意 推流失败问题排查
七牛云 二次推流报错,ffplay拉流播放的是Movie-1内容 RTMP能握手成功,但是推流几秒之后服务器会发来TCP RST包强制断开RTMP的TCP连接
与官方文档中提到的后者挤掉前者的说法不一致
推流不成功的原因和解决方法
金山云 二次推流报错,ffplay拉流播放的是Movie-1内容 抓包分析发现第二次推流的RTMP连接能握手成功,但是publish()请求发出之后服务器应答onStatus('NetStream.Publish.AlreadyExistStreamName')(见参考文档) 推拉流接入

结论

总的来说,按当前实验结果来看,在这种细枝末节的功能点上,金山云的文档说明最清晰最规范,点个赞!

网宿的行为符合Flash AS3的定义,至少有据可依。

而腾讯云与七牛云的文档说明均存在错误的地方(至少本次实验中是这样的),尤其是腾讯云的现象让我很意外。

而阿里云竟然连这块的文档都没有。。(也许是我没搜到,若有的话望指正)

参考

Adobe ActionScript3.0 NetStatusEvent

最新文章

  1. MVC 导出Excel 的其中一方法(View导出excel)
  2. CC2530使用串口下载(SBL)
  3. 1Z0-053 争议题目解析541
  4. iframe和frameset的使用
  5. smarty3.0中文手册文档API及使用指南
  6. android 弹幕效果demo
  7. HTML中解决双击会选中文本的问题
  8. 24种设计模式--装饰模式【Decorator Pattern】
  9. 【HDOJ】1332 LC-Display
  10. Fancybox——学习(1)
  11. css_day6
  12. python下如何处理windows的路径名
  13. Gas Station 解答
  14. 基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写
  15. 快速切换天财商龙门店后台.VB6.0
  16. --@angularJS--ng-show应用
  17. 将lvm逻辑卷分出一部分
  18. ionic3 百度地图插件定位 问题
  19. QT 字符串的使用技巧总结
  20. Unity Editor工具-代码里复制Component

热门文章

  1. 第 2 篇Scrum 冲刺博客
  2. Android全面解析之由浅及深Handler消息机制
  3. 关于Android手机CPU不同架构的问题
  4. SpringBoot+Redis相关配置文件
  5. 利用vs pcl库将多个PCD文件合并成一张PCD地图
  6. EM 算法-对鸢尾花数据进行聚类
  7. 四、testNG.xml 简单介绍
  8. Oracle数据泵常用命令
  9. Restful规则及JPA导致内存溢出
  10. Flink读写Redis(三)-读取redis数据