1

Ich verwende FFmpeg, um Videos von einer Kamera (die über Wifi mit keine Internetverbindung verbunden ist) zu einem anderen Server erneut zu streamen, und ich möchte den Re-Streaming-Prozess über mobile Daten tun. Da ich bereits mit WLAN verbunden bin und gleichzeitig Mobilfunkdaten verwenden bindProcessToNetwork(). Bevor ffmpeg Befehl ausführen Ich habe das getan folgendebindProcessToNetwork funktioniert nicht mit ffmpeg in android

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); 
     } 
    } 

}); 

es in den meisten der Fall fein arbeitet, wie webview ordnungsgemäß funktioniert, indem Zelldaten, während eine Verbindung zum Wi-Fi, aber wenn ich versuche, jede ffmpeg auszuführen Befehl es funktioniert nicht.

Antwort

2

bindProcessToNetwork ruft über netd auf, um den aktuellen Prozess an das ausgewählte Netzwerk zu binden. In ffmpeg-android-java ist die ffmpeg-Binärdatei executed using Runtime.getRuntime().exec(String). Folglich wird ffmpeg tatsächlich als separater Child-Prozess ausgeführt. Netd bindet untergeordnete Prozesse nicht automatisch an dasselbe Netzwerk wie ihr übergeordnetes Element, und Sie werden feststellen, dass ffmpeg diese Konfiguration nicht übernimmt. In der Zwischenzeit verwenden andere Aspekte Ihrer Anwendung wie WebView, URLConnection usw., die alle in Ihrem Prozess ausgeführt werden, das von Ihnen gewählte Netzwerk wie erwartet.

dieses Problem beheben Sie eine Reihe von Optionen (von leicht nach schwer):

  • die ffmpeg-android-java Quelle Ändern eines Befehlszeilenparameter für ffmpeg hinzuzufügen, die das Netzwerk sollte es gibt verwenden (von einem flüchtigen Blick ich sehe keine Unterstützung für diesen in ffmpeg)
  • Finden Sie ein Befehlszeilenprogramm, das das ffmpeg auf das richtige Netzwerk zwingen kann (kann root erfordern)
  • ffmpeg neu aufbauen, Unterstützung für native Sockets, die an das Netzwerk Ihrer Wahl gebunden sind
  • Rufen Sie netd direkt auf, um das Standardnetzwerk für den neuen ffmpeg-Prozess festzulegen (wahrscheinlich Root erforderlich)