bindProcessToNetwork不能与android

时间:2017-10-05 10:17:28

标签: android ffmpeg android-networking android-connectivitymanager

我正在使用FFmpeg从相机(通过wifi连接而没有互联网连接)重新传输视频到另一台服务器,我想通过移动数据进行重新流式处理。因为我已经连接到wifi并同时使用蜂窝数据bindProcessToNetwork()。在执行ffmpeg命令之前,我已完成以下操作

final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder req = new NetworkRequest.Builder();
req.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
req.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
cm.requestNetwork(req.build(), new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        //here you can use bindProcessToNetwork
        //cm.getNetworkInfo(network);
        if (cm.getNetworkInfo(network).getType() == ConnectivityManager.TYPE_MOBILE) {
            cm.bindProcessToNetwork(network);
        }
    }

});

在大多数情况下工作正常,例如webview通过使用蜂窝数据正常工作,同时连接到wifi,但是当我尝试执行任何ffmpeg命令时它不起作用。

1 个答案:

答案 0 :(得分:3)

bindProcessToNetwork调用netd以将当前进程绑定到所选网络。在ffmpeg-android-java中,ffmpeg二进制文件为executed using Runtime.getRuntime().exec(String)。因此,ffmpeg实际上是作为单独的子进程运行的。 Netd不会自动将子进程绑定到与其父进程相同的网络,因此您会发现ffmpeg不会继承此配置。与此同时,您的应用程序的其他方面(如WebView,URLConnection等)将在您的流程中运行,将按预期使用您选择的网络。

要解决此问题,您有多种选择(从最简单到最难):

  • 修改ffmpeg-android-java源为ffmpeg添加一个命令行参数,指定它应该使用的网络(从粗略的一瞥我看不到在ffmpeg中对此有任何支持)
  • 找一个可以强制ffmpeg二进制文件到正确网络的命令行实用程序(可能需要root)
  • 重建ffmpeg以添加对绑定到您选择的网络的本机套接字的支持
  • 直接调用netd为新的ffmpeg进程设置默认网络(可能需要root)