0

私は最近、Android用のffmpegとlive555をコンパイルし、独自のメディアクライアントラッパーを作成しました。システム全体は他のすべてのシステム(WindowsおよびLinux)で完全に機能しますが、Androidでは機能せず、UDPパケットを受信できませんでした。TCP接続を使用するRTSP通信は正常に機能します。セッションは正常に開始され、サーバーで実行され続けます。同様のトピックを検索したところ、最初はWi-Fiでマルチキャスト許可を取得する必要があるようです。だから私はしました:
-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"/>

-AndroidのActivity::onCreate()に次のJavaコードを配置します

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

しかし、それでも機能しません。結果は、エミュレーター、Galaxy S2 Phone、GalaxyTab10.1ですべて同じです。私もlive555モジュールを非アクティブ化し、ffmpegを使用します(ffmpegには組み込みのrtspクライアントもありますが、live555ほど安定していないため、live555をAndroidに移植しました)。結果は同じですが、rtsp ok、rtp notです。ここで、rtpはudpを基になるキャリアとして使用します。

DDMSにエラーが登録されています:
アドレスファミリはプロトコルでサポートされていません

問題は、UDPポートがまだブロックされていることだと思います。たぶん、Javaでmulticastlockを取得するだけでは、Androidのユーザーカーネルで実行されているネイティブコードには不十分です。

誰かアイデアがありますか?

スティーブン

4

2 に答える 2

0

私も同じ問題に直面しました。

私はあなたのバインドであなたがIPに入札していると思います、として使用htonl(INADDRY_ANY)してs_addrください。

これがあなたの原因に役立つかどうかはわかりませんが、私の問題は解決しているようです。

于 2012-04-18T06:13:05.823 に答える
0

meinem RTSP クライアントの UDP 問題は解決されました。パーミッションとマルチキャスト ロックは関係ありません。これは、android-ndk-r7 と android-ndk-r8 の両方で提供される、android stl ライブラリ実装内のバグです。誰でも gnu-libstdc++.so を使用したい場合は、覚えておく必要があります: 文字列、特に string::c_str() を使用しないでください。スタックに危険なポインターが残り、すべてに損害を与えます。stlに関係するすべてのものを捨てた後、tcpとudpのすべてが正常に機能します。少し話がずれます: live555 の内部には少なくとも 20 のバグがあり、最も致命的なエラーは次のとおりです: 彼らは tcp でブロックされていない rtp を使用したため、ほとんどのパケットはネットワーク インターフェイスに到達する前に失われ、rtsp クライアントでは、 rtp/tcp ソケットは、ネットワーク インターフェイスで失われたパケットを取得することはなく、rtsp セッションは無限の受信ループに入ります。

于 2012-05-13T15:53:45.123 に答える