我最近为android编译了ffmpeg和live555,并构建了自己的媒体客户端包装器。整个系统在所有其他系统(Windows和Linux)中都能很好地工作,但在android中却没有,只是没有收到UDP数据包。 RTSP通信工作正常,使用TCP连接。会话成功启动,并在服务器中继续运行。在搜索了类似的主题之后,我发现我似乎必须首先使用wifi获得多播许可。所以我做了:
- 在AndroidManifest.xml中放置权限
<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 Activity :: onCreate()
中放入以下java代码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 not,其中rtp使用udp作为底层载体。
在DDMS中注册错误:
协议不支持的地址系列
我认为,问题是UDP端口仍然被阻止。也许获得多播锁定 java对于在android的用户内核中运行的本机代码是不够的。
有人有想法吗?
史蒂芬
答案 0 :(得分:0)
我遇到了同样的问题。
我认为,在您的绑定中,您正在使用IP,请将htonl(INADDRY_ANY)
用作s_addr
。
不确定这是否有助于您的事业,但它似乎解决了我的问题。
答案 1 :(得分:0)
meinem RTSP客户端中的UDP问题已经解决,与权限和组播锁无关。它是android stl库实现中的bug,在android-ndk-r7和android-ndk-r8中都提供。任何人都想使用gnu-libstdc ++。所以必须记住:不要使用字符串,特别是string :: c_str(),它会在你的堆栈中留下危险指针,并损坏一切。在我抛弃了与stl有关的所有事情后,一切正常,tcp和udp。有点偏离主题:在live555中,至少有20个错误,最致命的错误是:他们在tcp上使用了未阻塞的rtp,因此,大多数数据包在到达网络接口之前都会丢失,而在rtsp客户端, rtp / tcp套接字永远不会得到网络接口丢失的数据包,然后rtsp会话进入无限接收循环,它会挂起。