gpt4 book ai didi

android - bindProcessToNetwork 不适用于 android 中的 ffmpeg

转载 作者:搜寻专家 更新时间:2023-11-01 08:24:33 28 4
gpt4 key购买 nike

我正在使用 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 命令时它不起作用。

最佳答案

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

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

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

关于android - bindProcessToNetwork 不适用于 android 中的 ffmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46583221/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com