我正在 Android 中编写一个 RTSP 客户端。我能够收到所有请求的响应,即
- 描述它发回 200 OK
- SETUP with transport: RTP/AVP:unicast:client_port=4568:4569 收到 200 OK 消息
- 发送 PLAY,并收到 OK 消息
之后如何获取音频和视频帧?
我在博客上搜索过,但都说要在 client_port 收听,但我没有收到任何数据包。
请让我知道我做得是否正确。
您可能知道也可能不知道,但 Android 已经使用 VideoView 内置了对 RTSP 的支持。
http://developer.android.com/reference/android/widget/VideoView.html
这可能会减少您的开发时间......或者如果您尝试推出自己的 RTSP 堆栈,它可能完全没用。
RTSP 仅用于启动流式传输。它为您提供了真实流的 SDP 描述。您必须管理每个通道(音频/视频)的 RTCP 连接和 RTP 连接。要使用的端口是“client_port”端口。
从头开始编写 RTSP/RTCP/RTP 堆栈非常复杂。您可以查看在 c++ 中实现此类堆栈的live555库。
在网络上放置一个嗅探器,您应该会看到目标端口为 4568 的 UDP 数据包以您的 IP 地址为目标。
使用像样的嗅探器,您将能够看到 rtsp 对话框。也许你在答案中遗漏了一些东西
您还应该检查 SETUP 响应的内容,以查看您请求的端口是否被接受。
要检查的事情:
如果您在路由器或防火墙后面,您可能不会收到任何信息,因为您的路由器/防火墙不知道如何处理传入的 UDP 数据包
首先尝试使用安装在 LAN 中的本地 Darwin 流媒体服务器。这样防火墙就没有问题了。流媒体将起作用。
如果您想从外部服务器尝试,那么:
1)检查服务器响应中提到的client_ports,一些服务器建议的端口与请求的端口不同。你必须使用服务器建议的端口。
2)如果端口正确,那么您可以从每个UDP端口向服务器发送64字节的空包(称为“开门器”)。
3)如果以上两个都没有解决,请检查服务器端日志。服务器可能正在关闭 UDP 端口。