2012-04-15 39 views
0

最近、アンドロイド用にffmpegとlive555をコンパイルし、独自のメディアクライアントラッパーを構築しました。システム全体は、他のすべてのシステム(WindowsとLinux)では完全に動作しますが、アンドロイドでは動作しません。UDPパケットは受信できません。 TCP接続を使用するRTSP通信は正常に動作します。セッションは正常に開始され、サーバーで稼動し続けます。似たような話題を探した後、最初にwifiでマルチキャストの許可を取得しなければならないようです。プット権限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"/> 

のAndroidManifest.xmlに - - アンドロイド活動における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をアンドロイドに移植しました)。結果は同じですが、rtsp ok、rtp not、rtpはudpを基本キャリアとして使用します。 DDMSで

がエラー登録されている:私は思うプロトコル

でサポートされていない
アドレスファミリ、問題はUDPポートがまだブロックされていることです。多分 でマルチキャストロックを取得しているJavaは、アンドロイドのユーザカーネルで動作しているネイティブコードでは不十分です。

誰もが知っていますか?

スティーブン

答えて

0

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

あなたの拘束であなたはIPに縛られていると思います。htonl(INADDRY_ANY)s_addrとしてください。

これがあなたの原因に役立つかどうかは不明ですが、私の問題を解決するようです。

+0

ありがとう、私はlive555モジュールでチェックします。 BTW。私は今、クライアントがtcp要求でrtpを送信するように切り替えました。すべてうまく動作し、udp要求はまだ機能しません。 UDP接続はリアルタイムメディアプレイヤーにとってはるかに優れたパフォーマンスを発揮します。TCPではパケットがTCPスタックに到達する前にネットワークインターフェイスで重いパケットが失われています。 – Steven

0

meinem RTSPクライアントのUDP問題が解決されました。許可とマルチキャストロックとは関係ありません。これはandroid-ndk-r7とandroid-ndk-r8の両方で提供されているandroid stlライブラリ実装のバグです。誰もgnu-libstdC++を使いたいと思っているので、特に文字列、特にstring :: c_str()を使用しないでください。スタックに危険ポインタが残っていて、すべてが損害を受けます。私はstlとすべてのことを捨てた後、すべてがうまくいきます、tcpとudp。少し話題がありません:live555の中には少なくとも20個のバグがあり、最も致命的なエラーは次のとおりです:tcp上のブロックされていないrtpを使用していたため、 rtp/tcpソケットは、ネットワークインタフェースで失われたパケットを受け取ることはありません。その後、rtspセッションは無限の受信ループに入り、ハングします。

関連する問題