objective-c – RTMP摄取块流的问题

我正在尝试为我正在处理的应用程序构建自己的客户端RTMP库.到目前为止,一切都已成功,因为我能够连接到RTMP服务器协商握手,然后发送所有必要的数据包(Fcpublish Publish ETC)然后从服务器获取NetStream.Publish.Start的onStatus消息,这意味着我成功地让服务器允许我开始发布我的实时视频广播. Wireshark还确认信息(/数据打包)是正确的,因为它也正确显示.

现在我遇到麻烦的地方是RTMP Chunking,第17页的Adobe RTMP Specification&图18示出了如何分组消息的示例.从这个例子中我可以看出它是根据块大小(128字节)分解的.对我来说,块大小在初始连接和交换中协商,总是4096字节.因此,当我交换大于4096字节的视频数据时,我需要将消息分块,然后发送RTMP packetHeader并结合前4096字节的数据,然后发送一个小的RTMP头,即0xc4(0xc0 | packetHeaderType(0x04))结合4096字节的视频数据,直到发送了标头指定的完整数据包.然后进入一个新框架并重复相同的过程.

通过检查用不同语言编写的其他RTMP客户端示例,这似乎就是他们正在做的事情.不幸的是,我尝试传输的摄取服务器没有接收广播视频数据,他们不关闭我的连接,他们只是从不显示视频或视频是正确的任何迹象. Wireshark显示,在发送视频原子数据包之后,发送的大多数数据包都是未知(0x0)一点,然后它们将切换到视频数据,并在显示未知(0x0)和视频数据之间进行触发.但是,如果我将有效负载最大大小限制为20000字节,Wireshark会将所有内容显示为视频数据.显然,摄取服务器不会在这种情况下显示视频,因为我正在删除大块的数据,因为它只有20k字节.

试图弄清楚出了什么问题我开始了另一个xcode项目,它允许我在我的Lan上欺骗RTMP服务器,以便我可以看到从libRTMP IOS进入服务器时数据的样子.同样使用libRTMP,我可以记录它发送的数据包,它们似乎注入字节0xc4甚至128字节,即使我已经发送Change Chunk size消息作为服务器.当我尝试在我的RTMP客户端库中通过使用128块大小来复制它时,即使它被设置为4096字节,服务器也将关闭我的连接.但是,如果更改libRTMP以尝试转到实时RTMP服务器,它仍会在LibRTMP中打印出它正在以128的块大小发送数据包.并且服务器似乎在视频显示时接受它.当我查看RTMP服务器上的数据时,我发现它就是他们的全部.

任何人都知道会发生什么事吗?

解决方法

虽然我没有专门使用RTMP,但我已经非常广泛地使用RTSP / RTP / RTCP,因此,根据我在此过程中获得的经验和挫伤,这里有一些随机的,可能适用的技巧可能会有所帮助/寻找可能导致问题的事情:

>您的视频编码是否与您告诉服务器的内容相符?换句话说,如果您的视频编码为H.264,那么您指定给服务器的是什么?
>数据是否与服务器期望的容器格式匹配?例如,如果服务器希望接收MPEG-4电影(.m4v)文件,但您只发送编码的MPEG-4(.mp4)流,则需要将MPEG-4视频流封装为MPEG-4电影容器.相反,如果服务器只需要一个MPEG-4视频流,但您要发送封装的MPEG-4电影,则需要将MPEG-4流从其容器中解复用并仅发送该内容.
>您是否考虑过传输介质的MTU?无论块大小如何,在客户端和服务器之间获得MTU不匹配都很难调试(并且可能是为什么您将某些数据包列为“未知”类型而其他数据包为“视频数据”类型).只要MTU是一致的,大多数操作系统都会使用大多数操作系统内置的分段和重组(SAR)基础设施,但是如果你必须自己做SAR逻辑,那么很容易得到这个错误.
>您是否尝试使用libRTMP iOS和您自己的客户端在Wireshark中捕获流量并将数据包并排比较?有时,“参考”数据包跟踪在发现原本看起来不重要的一点点(或许多)时非常有用.

祝好运!

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...