1

我正在使用FFmpeg将来自摄像头(通过无线连接的无线网络)的视频重新传输到另一台服务器,并且我想通过蜂窝数据执行重新流式传输过程。因为我已经连接到无线网络并同时使用蜂窝数据。执行ffmpeg的命令之前,我已经做了以下bindProcessToNetwork无法在android中使用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); 
     } 
    } 

}); 

它在大多数的情况下工作正常,像web视图通过使用蜂窝数据正常工作,而Wi-Fi连接,但是当我尝试执行任何的ffmpeg命令它不起作用。

回答

2

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

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

  • 修改的ffmpeg-Android的Java源代码添加一个命令行参数的ffmpeg指定网络它应该使用(从粗略地看一眼我没有看到任何支持这一点的ffmpeg)
  • 找到一个命令行工具,它可以强制ffmpeg的二进制到正确的网络(可能需要root)
  • 重建的ffmpeg添加支持本地套接字绑定到您选择的网络
  • 直接拨打宁波开发区以设置新的ffmpeg的过程中,默认网络(可能需要root)