用NDK编译的Android rtsp客户端无法接收任何UDP数据包
我最近为android编译了ffmpeg和live555,并构建了我自己的媒体客户端包装器。整个系统在所有其他系统(Windows和Linux)中都能很好地工作,但在android中却不行,只有不可能收到UDP数据包。 RTSP通信正常工作,它使用TCP连接。会话成功启动,并继续在服务器中运行。在搜索相似的主题后,我发现我似乎必须首先获得带有wifi的多播许可。所以我做:
- 认沽权限在AndroidManifest.xml用NDK编译的Android rtsp客户端无法接收任何UDP数据包
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE""/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
- 把下面的android系统中活动的Java代码:在OnCreate()
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
if(wm != null) {
mMCLock = wm.createMulticastLock(TAG);
mMCLock.acquire();
}
但它仍然不工作,结果在模拟器中都是一样的,在Galaxy S2 Phone和Galaxy Tab 10.1中的 。即使我停用live555模块,只使用ffmpeg(ffmpeg也有其内置的rtsp客户端,但不像live555那样稳定,因此我将live555移植到android中)。结果是一样的,rtsp ok,rtp不,rtp使用udp作为基础载体。
在DDMS是一个错误注册:
地址族不受协议支持
我认为,问题是,UDP端口仍然受阻。可能在 java中获取多播锁,对于在android的用户内核中运行的本机代码是不够的。
有没有人有想法?
Steven
我面临同样的问题。
我认为,在你的约束下,你正在使用IP,使用htonl(INADDRY_ANY)
作为s_addr
。
不确定这是否有助于您的原因,但似乎解决了我的问题。
meinem RTSP客户端的UDP问题已解决,与权限和组播锁无关。这是android stl库实现中的bug,在android-ndk-r7和android-ndk-r8中均提供。任何人都想使用gnu-libstdC++。所以必须记住:不要使用字符串,尤其是string :: c_str(),它会在你的堆栈中留下危险指针,并且会损坏所有的东西。在我抛出所有与stl有关的事情之后,一切正常,tcp和udp。一些小题目:在live555里面,至少有20个错误,最致命的错误是:他们使用TCP上的unblocked rtp,因此大多数数据包在到达网络接口之前会丢失,而在rtsp客户端, rtp/tcp套接字永远不会获取网络接口中丢失的数据包,然后一个rtsp会话进入无限的接收循环,它会挂起。
谢谢,我打算在live555模块中查看它。 BTW。我现在切换我的客户端通过tcp请求发送rtp,然后每件事情都可以正常工作,只是udp请求仍然无效。 UDP连接为实时媒体播放器提供了更好的性能,在TCP数据包到达TCP堆栈之前,TCP在网络接口中丢失了大量数据包。 – Steven 2012-04-24 13:31:25