Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用NDK编译的Android rtsp客户端无法接收任何UDP数据包_Android - Fatal编程技术网

使用NDK编译的Android rtsp客户端无法接收任何UDP数据包

使用NDK编译的Android rtsp客户端无法接收任何UDP数据包,android,Android,我最近为android编译了ffmpeg和live555,并构建了自己的媒体客户端包装器。整个系统在所有其他系统(windows和linux)中都能完美工作,但在android系统中却不能,只是无法接收到UDP数据包。RTSP通信工作正常,使用TCP连接。会话成功启动,并在服务器中保持运行。在搜索了类似的主题后,我发现似乎我必须首先获得wifi的多播许可。于是我做了: -将权限放入AndroidManifest.xml <uses-permission android:name="andr

我最近为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"/>
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);  
if( wm != null ) {  
    mMCLock = wm.createMulticastLock( TAG );  
    mMCLock.acquire();  
}
但它仍然不起作用,在Emulator、Galaxy S2和手机上的结果都是一样的 在Galaxy选项卡10.1中。甚至我停用了live555模块,只使用了ffmpeg(ffmpeg也有其内置的rtsp客户端,但不如live555稳定,因此,我将live555移植到android中)。结果是相同的,rtsp ok,rtp not,其中rtp使用udp作为底层载波

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

<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"/>
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);  
if( wm != null ) {  
    mMCLock = wm.createMulticastLock( TAG );  
    mMCLock.acquire();  
}
我认为,问题是UDP端口仍然被阻塞。也许是多播锁定 java对于运行在android用户内核中的本机代码是不够的

有人知道吗


史蒂文

我也面临同样的问题

我认为,在您的绑定中,您是在竞购IP,请使用
htonl(INADDRY\u ANY)
as
s\u addr


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

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

谢谢,我将在live555模块中检查它。顺便说一句,我现在将我的客户端切换为通过tcp发送rtp请求,然后一切正常,只是udp请求仍然不起作用。UDP连接为实时媒体播放器提供了更好的性能,使用TCP,在数据包到达TCP堆栈之前,网络接口中丢失了大量数据包。