我正在尝试为我正在处理的应用构建自己的客户端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服务器上的数据时,我发现它就是他们的全部。
任何人都知道会发生什么事情?
答案 0 :(得分:2)
虽然我还没有专门使用RTMP,但我已经广泛使用RTSP / RTP / RTCP了,因此,基于这种经验以及我在此过程中遇到的瘀伤,这里有一些随机的,可能是 - 可能有助于寻找可能导致问题的适用提示: