Ich möchte die Frames aus dem RTSP-Video mit ffmpeg abrufen. Aber für Android 10 oben bekomme ich Fehler wie unten.
E/FFmpeg: Exception while trying to run: [Ljava.lang.String;@55e447f
java.io.IOException: Cannot run program "/data/user/0/com.example.downloadimagefromurl/files/ffmpeg": error=13, Permission denied
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1050)
at java.lang.Runtime.exec(Runtime.java:698)
at java.lang.Runtime.exec(Runtime.java:563)
at com.github.hiteshsondhi88.libffmpeg.ShellCommand.run(ShellCommand.java:10)
at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:38)
at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:10)
at android.os.AsyncTask$3.call(AsyncTask.java:378)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: java.io.IOException: error=13, Permission denied
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)
Als Antwort von @Saurabh Thorat erlaubt Google Apps nicht, Binärdateien aus dem Verzeichnis / data / user auszuführen.
Eine schlechte Lösung, die ich kenne, besteht darin, compileSdkVersion und targetSdkVersion auf 28 oder niedriger zu ändern und meine Anwendung erneut freizugeben, was nicht empfohlen wird.
Daher suche ich auch für zukünftige Versionen nach praktikableren Lösungen.
Jeder Hinweis, Link oder Vorschlag wäre sehr dankbar. Danke im Voraus.
android
ffmpeg
permissions
rtsp
android-10.0
Gowthami
quelle
quelle
Antworten:
Ab Android Q können Sie keine Binärdateien im privaten Datenverzeichnis Ihrer App ausführen.
Vom Issuetracker: https://issuetracker.google.com/issues/128554619
quelle
Ändern Sie nur die Build.gradle-Datei targetSdkVersion 29 bis 28 und installieren Sie Ihre App erneut auf Ihrem Gerät
quelle
Die frühere Antwort erklärt das Problem, auf das Sie stoßen, richtig. Dies ist auch ein offenes Thema, das im letzten September angesprochen wurde und im Forum der von Ihnen verwendeten Bibliothek diskutiert wurde (nach dem, was ich im Stack-Trace sehen kann).
Die Lösung für die Kompilierung für SDK 29 besteht darin, keine Binärdateien mehr im Verzeichnis / data / abzulegen und sicherzustellen, dass sie sich im nativen libs-Verzeichnis befinden. Dies kann nicht erreicht werden, nachdem das APK auf nicht gerooteten Geräten installiert und entpackt wurde. Dies sollte daher bei der Vorbereitung des Android-Projekts (z. B. durch Gradle-Einstellungen) korrekt erfolgen und um sicherzustellen, dass der Inhalt bei der Installation ordnungsgemäß entpackt wird:
android:extractNativeLibs=true
.In Ihrem Fall verschiebt dieser Code Binärdateien, die als "Assets" gepackt sind, in das Benutzerdatenverzeichnis:
https://github.com/WritingMinds/ffmpeg-android-java/blob/master/FFmpegAndroid/src/main/java/com/github/hiteshsondhi88/libffmpeg/FileUtils.java
Dies ist ein Sicherheitsrisiko, wenn ausführbare Dateien an einem lesbaren / beschreibbaren Speicherort ausgeführt werden. Der Quellcode, auf den ich oben verlinkt habe, müsste entfernt werden, stattdessen die in / libs gepackten nativen Binärdateien. Die Änderung ist sicherer, da der Speicherort / libs in Ihrem Apps-Installationsverzeichnis ausführbar, aber nicht beschreibbar ist.
Zusammenfassend muss die Bibliothek eines Drittanbieters darauf eingehen, oder Sie können dies tun und eine Pull-Anfrage einreichen. Oder teilen Sie Ihre eigenen und kompilieren Sie sie selbst neu.
Es gibt immer noch ein Problem, wenn Ihre App nach der Installation tatsächlich Inhalte herunterlädt und erwartet, dass Downloads ausgeführt werden. Soweit ich in Android 10 sagen kann, ist das jetzt unmöglich.
Die zukunftssichere Lösung besteht darin, keine externen Binärdateien mehr zu verwenden und die Abhängigkeiten als NDK-Projekte zu kompilieren. Sie benötigen JNI-Wrapper für nativen Code (ein bisschen Arbeit). Es gibt ein verwandtes Projekt , von dem ich weiß, dass Sie es untersuchen könnten.
quelle