Играть в RTSP через локальную сеть Wi-Fi - PullRequest
0 голосов
/ 04 мая 2020

Я хочу воспроизвести поток RTSP с IP-камеры, подключенной к локальной сети Wi-Fi. Подключение устройства Android к сети вручную и последующее воспроизведение видео работает (я получаю только предупреждение «провайдер контента не найден», но все равно работает) Но если я сделаю запрос NetworkRequest, а затем свяжу процесс с сетью, метод VideoView.setVideoUri не привязывает сокет к новой сети. Я попытался пропинговать IPCamera с помощью InetAdress.isReachable(), и он работает, поэтому я предположил, что метод ConnectivityManager.bindProcessToNetwork(network) работает.

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_camera);
    videoView = findViewById(R.id.videoView_Camera);

    connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
        mConnectToWifiApi29();
    }
    else{
        mConnectToWifi();
    }

@RequiresApi(api = Build.VERSION_CODES.Q)
private void mConnectToWifiApi29(){
    WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier.Builder()
            .setSsid(myssid)
            .setWpa2Passphrase(mypassword)
            .build();

    NetworkRequest networkRequest = new NetworkRequest.Builder()
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
            .setNetworkSpecifier(wifiNetworkSpecifier)
            .build();

    if (connectivityManager != null) connectivityManager.requestNetwork(networkRequest, networkCallback);

}

final private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback(){

    @Override
    public void onAvailable(@NonNull Network network) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
             connectivityManager.bindProcessToNetwork(network);
        }
        else{
             ConnectivityManager.setProcessDefaultNetwork(network);
        }

        mVideo();

        super.onAvailable(network);
    }
};

private void mVideo() {
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                videoView.setVideoURI(Uri.parse("rtsp://user:password@192.168.1.10));
                videoView.requestFocus();
                videoView.start();
            }
        });
...