我最近为 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 中获取多播锁可能是不够的。
有人有想法吗?
史蒂文