bindProcessToNetwork не работает с ffmpeg в Android

Я использую FFmpeg для повторного потокового видео с камеры (которая подключена через Wi-Fi с нет подключения к Интернету) на другой сервер, и я хочу выполнить процесс повторной потоковой передачи через сотовые данные. Поскольку я уже подключен к Wi-Fi и одновременно использую сотовые данные 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);
        }
    }

});

в большинстве случаев он работает нормально, например, веб-просмотр работает правильно, используя сотовые данные при подключении к Wi-Fi, но когда я пытаюсь выполнить любую команду ffmpeg, это не работает.


person Mithun Sarker Shuvro    schedule 05.10.2017    source источник


Ответы (1)


bindProcessToNetwork обращается к netd, чтобы связать текущий процесс с выбранной сетью. В ffmpeg-android-java бинарным файлом ffmpeg является . Следовательно, ffmpeg фактически работает как отдельный дочерний процесс. Netd не привязывает автоматически дочерние процессы к той же сети, что и их родитель, поэтому вы обнаружите, что ffmpeg не наследует эту конфигурацию. Между тем, другие аспекты вашего приложения, такие как WebView, URLConnection и т. д., которые выполняются в вашем процессе, будут использовать выбранную вами сеть, как и ожидалось.

Чтобы решить эту проблему, у вас есть несколько вариантов (от самого простого к самому сложному):

  • Измените источник ffmpeg-android-java, чтобы добавить параметр командной строки для ffmpeg, который указывает сеть, которую он должен использовать (на первый взгляд, я не вижу поддержки для этого в ffmpeg)
  • Найдите утилиту командной строки, которая может принудительно подключить двоичный файл ffmpeg к нужной сети (может потребоваться root)
  • Перестройте ffmpeg, чтобы добавить поддержку собственных сокетов, привязанных к сети по вашему выбору.
  • Напрямую вызовите netd, чтобы установить сеть по умолчанию для нового процесса ffmpeg (вероятно, потребуется root)
person gisHermit    schedule 12.10.2017