0

我最近为 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"/>

- 将以下java代码放入android Activity::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 not,其中rtp使用udp作为底层载体。

在 DDMS 中注册了一个错误:
协议不支持地址系列

我认为,问题在于 UDP 端口仍然被阻塞。对于在 android 的用户内核中运行的本机代码,在 java 中获取多播锁可能是不够的。

有人有想法吗?

史蒂文

4

2 回答 2

0

meinem RTSP客户端的UDP问题已经解决,与权限和组播锁无关。这是 android-ndk-r7 和 android-ndk-r8 都提供的 android stl 库实现中的错误。任何想使用 gnu-libstdc++.so 的人都必须记住:不要使用字符串,尤其是 string::c_str(),它会在堆栈中留下危险指针,并损坏一切。在我扔掉与stl有关的所有事情之后,一切正常,tcp和udp。题外话:live555内部至少有20个bug,最致命的错误是:他们使用unblocked rtp over tcp,因此,大多数数据包在到达网络接口之前就丢失了,而在rtsp客户端, rtp/tcp 套接字永远不会收到在网络接口中丢失的数据包,然后一个 rtsp 会话进入无限接收循环,

于 2012-05-13T15:53:45.123 回答
0

我遇到了同样的问题。

我认为,在你的绑定中,你正在竞标一个 IP,使用htonl(INADDRY_ANY)as s_addr

不确定这是否有助于您的事业,但它似乎解决了我的问题。

于 2012-04-18T06:13:05.823 回答