bindProcessToNetwork 不适用于 android 中的 ffmpeg

Posted

技术标签:

【中文标题】bindProcessToNetwork 不适用于 android 中的 ffmpeg【英文标题】:bindProcessToNetwork is not working with ffmpeg in android 【发布时间】:2018-03-16 22:20:35 【问题描述】:

我正在使用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】:

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)

【讨论】:

以上是关于bindProcessToNetwork 不适用于 android 中的 ffmpeg的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow - 多 GPU 不适用于模型(输入),也不适用于计算梯度

为啥 UITableViewAutomaticDimension 不适用于 sectionFooterHeight?

为啥排序不适用于矢量?

验证不适用于 saveMany

UipanGesture 不适用于 Uiswitch

jQuery 不适用于 Express