1

FFmpeg 카메라를 인터넷에 연결하지 않고 wifi를 통해 다른 서버에 다시 스트리밍하고 셀룰러 데이터를 통해 스트리밍 프로세스를 수행하고 싶습니다. 이미 Wi-Fi에 연결되어 있고 셀룰러 데이터를 동시에 사용하고 있기 때문에 bindProcessToNetwork(). 는 FFmpeg 명령을 실행하기 전에 내가 수행 한 셀룰러 데이터를 사용하여 제대로 작동이 연결되어있는 동안 무선 랜에, 웹뷰 같은 경우의 대부분에서 잘 작동하지만, 내가 어떤는 FFmpeg을 실행하려고 할 때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); 
     } 
    } 

}); 

다음 명령이 작동하지 않습니다.

답변

2

bindProcessToNetwork는 현재 프로세스를 선택한 네트워크에 바인드하기 위해 netd를 호출합니다. ffmpeg-android-java에서 ffmpeg 이진수는 executed using Runtime.getRuntime().exec(String)입니다. 따라서 ffmpeg는 실제로 별도의 하위 프로세스로 실행됩니다. Netd는 자식 프로세스를 부모와 동일한 네트워크에 자동으로 바인딩하지 않으므로 ffmpeg가이 구성을 상속받지 않는다는 것을 알 수 있습니다. 그 동안에 WebView, URLConnection 등과 같은 응용 프로그램의 다른 측면은 프로세스 내에서 모두 실행되며 예상대로 선택한 네트워크를 사용합니다.

당신이 옵션을 가지고이 문제를 해결하려면 (쉬운에서까지 어려운) :

  • 가해야 네트워크를 지정는 FFmpeg에 대한 명령 줄 매개 변수를 추가 할 수는 FFmpeg - 안드로이드 - 자바 소스를 수정
  • 하는 대한 지원을 추가 할 수는 FFmpeg를 재 구축 (루트가 필요할 수 있음)
  • 가 올바른 네트워크에 ffmpeg라는 바이너리를 강제 할 수있는 명령 줄 유틸리티를 찾아 (내가는 FFmpeg이에 대한 모든 지원을 참조하지 않는 피상적 인 눈에서) 사용 네이티브 소켓은 사용자가 선택한 네트워크에 연결됩니다.
  • 새로운 ffmpeg 프로세스의 기본 네트워크를 설정하기 위해 netd를 직접 호출하십시오 (루트가 필요할 수 있음)