我正在使用基于WinPCap构建的SharpPCap来捕获UDP流量.我的最终目标是从H.323捕获音频数据并将这些电话对话保存为WAV文件.但首先要做的是 - 我需要弄清楚我的UDP数据包是通过网卡的.
SharpPCap提供了一个UdpPacket类,使我可以访问消息的PayloadData.但我不确定这些数据是做什么的.它是一个Byte []数组,我不知道如何确定它是否是RTP或RTCP数据包.
我用Google搜索了这个主题,但那里没有多少.任何帮助表示赞赏.
我对RTP很新,有人可以解释一下CSRC和SSRC吗?
来自http://www.rfc-editor.org/rfc/rfc3550.txt,它的含义是:SSRC字段标识同步源.这是否意味着,在网络中可能有许多发送者正在为RTP(多播网络)做出贡献并确定数据包来自哪个来源?
CSRC:贡献源(CSRC):RTP数据包流的来源,它对RTP混频器产生的组合流做出了贡献(见下文).不清楚,不知道,不懂.
有人可以用例子解释一下吗?谢谢
不幸的是,我仍然坚持使用一点RTP/RTCP通信来正确访问我的IP摄像头.
我想做什么
相机有一个我想读的内部缓冲区.因此,我通过RTSP与相机通信,并告诉它流式传输数据.当摄像机通过整个缓冲区时,流媒体将停止.
到目前为止我有什么
通过RTSP与DESCRIBE/ SETUP/ PLAYRequest(RTSP)通信以启动流的TCP连接.当Camera传输数据时,此连接必须保持打开状态.
我收到通过RTP发送的数据的端口(基于UDP) - 处理这个并不是我关心的问题,我甚至完全无法访问它,我只想提及它是为了完整性.
接收RTCP Sender Reports/的UDP套接字Source Descriptions.这很重要,因为我不知道流何时停止(如第2点所述,我不能只看流停止时).在这个Socket我读到RTCP Sender Report Goodbye到来,这意味着流式传输已经完成.然后我可以关闭TCP Socket(来自RTSP通信).
出了什么问题
它适用于2MB或4MB等小缓冲区.我收到了一些源描述,然后是Goodbye.但在我的特定测试案例中,我想使用16MB(仍然不到相机能力的一半).我收到发件人报告,但在某些时候(总是大约8MB +/- 300KB),相机才停止发送.
值得注意的是,我可以通过VLC访问缓冲区而不会出现问题.我甚至看过通信(RTSP和RTCP),它与我的应用程序几乎完全相同......我想在下面提到的一件事:
可能的原因
这是我需要你的建议的部分.
可能性:缺乏接收者报告
当通过VLC进行流式传输时,我注意到有一些RTCP Receiver Reports从VLC发送到摄像机(类似于循环Sender Reports).那么camere是否期望在Receiver Report特定时间内(或者在发送特定数量的字节之后)至少有一个?目前我想不出任何其他原因.
解?
如果我们假设相机停止流式传输,因为没有Receiver Reports我想知道是否有办法实现它们而不需要携带太多信息.我已经阅读了一些RFC 3550,我猜这些报告消息背后仍然有一堆逻辑.现在我实际上不需要,所以我也不想在这里实现完整的RTCP协议.是否足以发送一些Receiver Report虚拟帧,以便相机继续流式传输?如果是这样,他们怎么样?
如果它与缺乏无关Receiver Reports,我只是不需要它们,那么相机停止流动的原因是什么呢?有什么建议?
编辑:
好吧,我只是设法制作某种Dummy Receiver Report,它似乎工作(我只能收到12MB然后我得到了所需的再见)
我只填充了一个28Byte缓冲区,并在Header字段中使用了一些值,这意味着:
buffer[0] = 0x80; // Version 2 , …Run Code Online (Sandbox Code Playgroud) 我遵循了关于WebRTC的整个教程并实现了简单的p2p聊天.我的信令服务器正在localhost:9090上工作.当我尝试发送消息时,我收到:
RTCDataChannel.readyState is not 'open'
Run Code Online (Sandbox Code Playgroud)
但是,连接似乎已正确建立:
Connected
Got message {"type":"login","success":true}
RTCPeerConnection object was created
RTCPeerConnection {localDescription: RTCSessionDescription, remoteDescription: RTCSessionDescription, signalingState: "stable", iceGatheringState: "new", iceConnectionState: "new"…}
Channel created
Got message {"type":"answer","answer":{"type":"answer","sdp":"v=0\r\no=- 5123156273253761787 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE data\r\na=msid-semantic: WMS\r\nm=application 9 UDP/TLS/RTP/SAVPF 127\r\nc=IN IP4 0.0.0.0\r\nb=AS:30\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:aWnc+x1ot0kpmCj6\r\na=ice-pwd:o8BH8EIsb/FVLBDkUt5Mw6V4\r\na=fingerprint:sha-256 D6:18:83:20:FC:3F:0B:87:8F:FB:D8:5D:D6:33:13:FE:C6:EE:53:3D:18:69:DD:C0:BF:23:35:95:F7:26:4D:F2\r\na=setup:active\r\na=mid:data\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:127 google-data/90000\r\na=ssrc:2024832766 cname:y/zAQto2dzSH04r0\r\na=ssrc:2024832766 msid:myDataChannel myDataChannel\r\na=ssrc:2024832766 mslabel:myDataChannel\r\na=ssrc:2024832766 label:myDataChannel\r\n"}}
Got message {"type":"candidate","candidate":{"candidate":"candidate:2633341356 1 udp 2113937151 172.20.10.6 54721 typ host generation 0 ufrag aWnc+x1ot0kpmCj6","sdpMid":"data","sdpMLineIndex":0}}
candidate added
Run Code Online (Sandbox Code Playgroud)
这是client.js的代码:
如何确保每个客户端真正连接到另一个客户端并且答案/ SDP是否正确?对此有任何提示:可能过早创建频道,只能在整个"握手"之后完成?非常感谢
__在Jib第一回答后编辑__
var connectedUser, myConnection, dataChannel;
//when a user …Run Code Online (Sandbox Code Playgroud) 我已经捕获了三个不同的流作为带有元数据的pcap文件.如何流回RTP/RTCP流?
我试图了解spydroid(https://code.google.com/p/spydroid-ipcamera/)的工作原理,以便我可以为我的手机编写类似的应用程序。基于spydroid,这是我对RTSP、RTCP和RTP的理解。
RTSP 在指定端口上运行并设置一切。
RTCP 可以在任何端口上运行。有一个客户端端口和一个服务器端口。这是RTP的控制流程
RTP 可以在任何端口上运行。有一个客户端端口和一个服务器端口。其中包含音频和视频流。这很令人困惑,因为它似乎实际上并未在此端口上发送音频和视频。在spydroid中,它在端口5006上发送视频,在5004上发送音频。
Spydroid 正在通过 RTSP 发送此消息以确认端口...传输:RTP/AVP/UDP;单播;destination=123.456.789.00;client_port=65234-65235;server_port=44580-44581;ssrc=ba98a863;mode=play
我认为这意味着客户端(在我的例子中是 VLC)正在使用 UDP 侦听 65234 的 RTP 和 65235 的 RTCP 消息。此外,spydroid 正在侦听 44580 的 RTP 和 44581 的 RTCP。这是正确的吗?
现在,在 RTSP 的 DESCRIBE 序列中,spydroid 告诉客户端 m=video 5006 RTP/AVP 96 我认为这表明它将通过端口 5006 通过 UDP 发送视频。
我在上面的句子中所说的一切听起来都正确吗?
我真正想知道的是如何将此信息转发到正确的端口。客户端端口由 VLC 自动分配。我尝试运行这个命令... vlc "rtsp://192.168.1.104:8086" --rtp-client-port=58866 但VLC似乎忽略它并选择它自己的端口。所以我转发了端口 8086、5004 和 5006,但我不知道为 RTP 和 RTCP 连接转发哪个端口,因为它每次都会改变。我可以完成这项工作的唯一方法是将所有端口转发到我的计算机。(我有一个 linksys 路由器,它有一个 DMZ 选项)但这是一个糟糕的解决方案。有人可以指导我正确的方向吗?
另外,很高兴知道我正在这样做,因为我是通过互联网上的外部 IP 地址发送所有内容。其中spydroid旨在在局域网上使用。
我想知道这条SDP线的含义,因为我正在尝试以5%到10%的数据包丢失来获得最平滑的帧率。
我不知道的行是:a = rtcp-fb:100 goog-remb a = rtcp-fb:100 transport-cc
我不知道为什么firefox(例如)取消了“ transport-cc”功能,即使我必须解码不完整的视频帧,我是否也想使流帧率平滑?
最好的问候,我希望有人可以帮助我:)