Android bindProcessToNetwork和RTSP流媒体播放器

Android bindProcessToNetwork和RTSP流媒体播放器,android,networking,rtsp,Android,Networking,Rtsp,我有一个应用程序正在使用bindProcessToNetwork()强制通过wifi连接进行所有连接。之所以这样做,是因为wifi连接到一个没有互联网连接的摄像头,所以android自然会尝试通过具有完全互联网连接的蜂窝数据连接将所有流量推出。这方面的代码是: final ConnectivityManager connection_manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_

我有一个应用程序正在使用bindProcessToNetwork()强制通过wifi连接进行所有连接。之所以这样做,是因为wifi连接到一个没有互联网连接的摄像头,所以android自然会尝试通过具有完全互联网连接的蜂窝数据连接将所有流量推出。这方面的代码是:

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流并尝试通过android 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请求似乎无法通过wifi连接到达摄像头。几乎就好像只有HTTP请求被bindProcessToNetwork()强制通过wifi。但情况并非如此,因为在应用程序的其他地方,正在使用[InetAddress.isRecable()][1]对摄像头进行ping


有没有办法强制MediaPlayer RTSP连接也通过wifi连接?

从我读到的有关media player API的内容来看,媒体播放由运行在单独进程上的
MediaServer处理()。当您调用
bindProcessToNetwork
时,您正在强制您的应用程序(在自己的进程上运行)仅使用WiFi网络,这将
对MediaServer的行为没有影响
(因为它在与您的应用程序分开的进程上运行)


因此,您可以选择将媒体文件拉到android设备上,并将其作为本地文件播放,而不是流媒体播放。

您解决了这个问题吗?我也遇到了同样的问题。我们最终做的是使用ffmpeg。您可以将库编译到应用程序中,它作为同一进程的一部分运行,这样bindProcessToNetwork就可以按预期执行。您是对的。这样,您仍然可以进行流式处理,而不必先将文件下载到设备上。@Kebabman您能给我们一个例子,说明如何在相同的过程中运行它吗?通常,它使用
Runtime.getRuntime().exec(“ffmpeg”)
运行,这会将它分离到另一个进程。@Danpe-我想您使用的是ffmpeg可执行文件吗?