2012-04-15 1 views
0

Ich kompilierte vor kurzem ffmpeg und live555 für Android, und baute meine eigene Media-Client-Wrapper. Das ganze System funktioniert perfekt in allen anderen Systemen (Windows und Linux), aber nicht in Android, nur UDP-Pakete konnten nie empfangen werden. Die RTSP-Kommunikation funktioniert gut, die TCP-Verbindung verwendet. Die Sitzung wird erfolgreich gestartet und auf dem Server ausgeführt. Nachdem ich nach den ähnlichen Themen gesucht habe, scheint es, dass ich zuerst eine Multicasting-Erlaubnis mit WLAN erwerben muss. Also habe ich:
- Put-Berechtigungen in AndroidManifest.xmlAndroid RTP-Client kompiliert mit NDK kann keine UDP-Pakete empfangen

<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"/> 

- setzen Java-Codes in Android-Aktivität folgende :: onCreate()

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
if(wm != null) { 
    mMCLock = wm.createMulticastLock(TAG); 
    mMCLock.acquire(); 
} 

es gibt aber noch nicht Arbeit, die Ergebnisse sind alle gleich in Emulator, in Galaxy S2 Phone und in Galaxy Tab 10.1. Sogar ich deaktiviere das live555-Modul und benutze nur ffmpeg (ffmpeg hat auch seinen eingebauten rtsp-Client, aber nicht so stabil wie live555, dafür portierte ich live555 nach android). Die Ergebnisse sind die gleichen, rtsp ok, rtp nicht, wobei rtp UDP als zugrunde liegenden Träger verwendet.

In DDMS ist ein Fehler registriert:
Adresse Familie nicht durch Protokoll unterstützt

denke ich, das Problem ist, dass das UDP-Port gesperrt ist nach wie vor. Vielleicht ist das Erhalten von Multicastlock in Java nicht genug für nativen Code, der im Benutzerkern von Android läuft.

Hat jemand eine Idee?

Steven

Antwort

0

stand ich das gleiche Problem.

Ich denke, in Ihrer Bindung, die Sie auf eine IP warten, verwenden Sie htonl(INADDRY_ANY) als s_addr.

nicht sicher, ob dies Ihrer Ursache hilft, aber es scheint mein Problem zu lösen.

+0

Danke, ich werde es in live555 Modul überprüfen. Übrigens. Ich habe jetzt meinen Client umgeschaltet, um rtp über TCP-Anfrage zu senden, dann funktioniert alles gut, nur die UDP-Anfrage funktioniert immer noch nicht. Eine UDP-Verbindung macht eine viel bessere Leistung für Echtzeit-Media-Player, mit TCP habe ich schwere Paket verloren in der Netzwerkschnittstelle, bevor die Pakete den TCP-Stack erreichen. – Steven

0

Das UDP-Problem in meinem RTSP-Client wurde gelöst, es gibt nichts mit Berechtigung und Multicast-Sperre zu tun. Es ist der Fehler in android stl Bibliothek Implementierung, in Android-ndk-r7 und Android-ndk-r8 beide zur Verfügung gestellt. Jeder will gnu-libstdC++ benutzen, also bedenke: benutze keinen string, besonders string :: c_str(), es hinterlässt einen Gefahrenzeiger in deinem Stack und schädigt alles. Nachdem ich alles, was mit stl zu tun hat, rausgeworfen habe, funktioniert alles gut, tcp und udp. Ein wenig off-topic: In der Live555 gibt es mindestens 20 Bugs, und die meisten fatalen Fehler sind: sie verwendeten unblocked rtp über TCP, daher gehen die meisten Pakete verloren, bevor sie die Netzwerkschnittstelle erreichen, und auf rtsp client, der rtp/tcp socket wird nie die Pakete erhalten, die in der Netzwerkschnittstelle verloren gehen, und dann geht eine rtsp-session in endlose Empfangsschleife, sie hängt.

Verwandte Themen