2017-02-02 21 views
3

У меня есть приложение, которое использует bindProcessToNetwork(), чтобы принудительно отключить все соединения по Wi-Fi-соединению. Это делается потому, что соединение Wi-Fi подключено к камере без подключения к Интернету, поэтому, естественно, андроид пытается вытолкнуть весь трафик через сотовую связь, которая имеет полное подключение к Интернету. Код для этого: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 играет хорошо, так как маршрут по умолчанию находится вне по сети Wi-Fi. Однако, когда обе сети подключены, кажется, что запрос RTSP не проходит через камеру через соединение Wi-Fi. Это почти так, как если бы HTTP-запросы вызывались через Wi-Fi через bindProcessToNetwork(). Это не может быть так, как и в другом месте приложения, когда камера пингуется с помощью [InetAddress.isReachable()] [1]

Есть ли способ заставить соединение MediaPlayer RTSP переходить через соединение Wi-Fi как Что ж?

+0

Вы решили проблему? Я столкнулся с той же проблемой. –

ответ

0

Из того, что я прочитал о API медиаплеера, воспроизведение мультимедиа обрабатывается MediaServer, который работает по отдельному процессу (lookie here). Когда вы вызываете bindProcessToNetwork, вы заставляете свое приложение (которое работает на собственном процессе) использовать только сеть Wi-Fi, и у этого будет no effect on MediaServer's behaviour (потому что он выполняется по отдельному процессу из вашего приложения).

Похоже, что у вас есть возможность вытащить файл мультимедиа на устройство Android и воспроизвести его как локальный файл, а не потоковое воспроизведение.

+0

Спасибо. Я исследую этот момент. –

+0

Что мы в итоге сделали, так это использовать ffmpeg. Вы можете скомпилировать библиотеку в приложение, и она выполняется как часть одного процесса, поэтому bindProcessToNetwork выполняет так, как ожидалось. – Kebabman

+0

Вы правы. Таким образом, вы все равно можете передавать без необходимости загружать файл на свое устройство. – k1slay