2012-04-15 104 views
0

我最近爲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

回答

0

我面臨同樣的問題。

我認爲,在你的約束下,你正在使用IP,使用htonl(INADDRY_ANY)作爲s_addr

不確定這是否有助於您的原因,但似乎解決了我的問題。

+0

謝謝,我打算在live555模塊中查看它。 BTW。我現在切換我的客戶端通過tcp請求發送rtp,然後每件事情都可以正常工作,只是udp請求仍然無效。 UDP連接爲實時媒體播放器提供了更好的性能,在TCP數據包到達TCP堆棧之前,TCP在網絡接口中丟失了大量數據包。 – Steven 2012-04-24 13:31:25

0

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會話進入無限的接收循環,它會掛起。

相關問題