2017-02-02 169 views
3

我有一個應用程序正在使用bindProcessToNetwork()強制通過WiFi連接的所有連接。這是因爲wifi連接連接到沒有互聯網連接的攝像頭,所以android自然會嘗試通過具有完整互聯網連接的蜂窩數據連接推送所有流量。這個代碼是:Android bindProcessToNetwork和RTSP流通過MediaPlayer

final ConnectivityManager connection_manager = 
      (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkRequest.Builder request = new NetworkRequest.Builder(); 
    request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); 

    connection_manager.requestNetwork(request.build(), new ConnectivityManager.NetworkCallback() 
    { 
     @Override 
     public void onAvailable(Network network) 
     { 
      try { 
       connection_manager.bindProcessToNetwork(network); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

此連接到相機時通過HTTP發出命令工作正常等。然而,發起RTSP流並試圖通過一個機器人的MediaPlayer進行查看時,將無法連接。對於媒體播放器的代碼:

mMediaPlayer = new MediaPlayer(); 
mMediaPlayer.setSurface(new Surface(mTextureView.getSurfaceTexture())); 
mMediaPlayer.setWakeMode(getActivity().getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); 
mMediaPlayer.setDataSource(loc); 
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
mMediaPlayer.prepareAsync(); 

如果我禁用了手機上的蜂窩數據,代碼完美的作品和RTSP流正常播放,默認路由是出了WiFi網絡。但是,當兩個網絡連接時,看起來RTSP請求沒有通過無線連接進入攝像機。這幾乎就像只有HTTP請求通過bindProcessToNetwork()被強制通過wifi。這不可能是這樣的情況,但在應用程序中的其他地方相機正在使用ping [InetAddress.isReachable()] [1]

是否有任何方法來強制MediaPlayer RTSP連接通過WiFi連接好?

+0

你解決了這個問題嗎?我遇到了同樣的問題。 –

回答

0

從我已閱讀的媒體播放器API中,媒體播放由MediaServer處理,它在單獨的進程(lookie here)上運行。當你打電話給bindProcessToNetwork時,你迫使你的應用程序(它運行在自己的進程上)只使用WiFi網絡,並且這將有no effect on MediaServer's behaviour(因爲它運行在與你的應用程序不同的進程上)。

所以看起來像你的選擇是將媒體文件拖到android設備並播放它作爲本地文件,而不是流媒體文件。

+0

謝謝。我會調查這一點。 –

+0

我們最終做的是使用ffmpeg。您可以將庫編譯到應用程序中,並將其作爲同一進程的一部分運行,以便bindProcessToNetwork按預期執行。 – Kebabman

+0

你說得對。這樣,您仍然可以在無需首先將文件下載到設備的情況下進行流式傳輸。 – k1slay