web-dev-qa-db-ja.com

FFMPEGコマンドがAndroid Qで機能しない

このコマンドを試して2つのオーディオファイルをマージしますが、Android 10.0(Q)while targeting sdk 29では機能しませんが、このコマンドは完全に機能しています- targeting sdk 24 to 28

私はこのFFMPEG実装のライブラリを使用しています 'nl.bravobit:Android-ffmpeg:1.1.7'

"-y", "-i", path1, "-i", path2, "-filter_complex", "[0:0][1:0] amix=inputs=2:duration=longest", "-c:a", "libmp3lame", savedPath

my Error log:
2019-09-28 13:48:32.037 16041-16166/com.merger.cut E/FFmpeg: Exception while trying to run: [/data/user/0/com..merger.cut/files/ffmpeg, -y, -i, /storage/emulated/0/Music/song1.mp3, -i, /storage/emulated/0/Music/song2.mp3, -filter_complex, [0:0][1:0] amix=inputs=2:duration=longest, -c:a, libmp3lame, /storage/emulated/0/merger/Merge_1569658695254.mp3]
    Java.io.IOException: Cannot run program "/data/user/0/com.merger.cut/files/ffmpeg": error=13, Permission denied
        at Java.lang.ProcessBuilder.start(ProcessBuilder.Java:1050)
        at nl.bravobit.ffmpeg.ShellCommand.run(ShellCommand.Java:15)
        at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.Java:43)
        at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.Java:12)
        at Android.os.AsyncTask$3.call(AsyncTask.Java:378)
        at Java.util.concurrent.FutureTask.run(FutureTask.Java:266)
        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)
        at Java.lang.ProcessImpl.start(ProcessImpl.Java:141)
        at Java.lang.ProcessBuilder.start(ProcessBuilder.Java:1029)
        at nl.bravobit.ffmpeg.ShellCommand.run(ShellCommand.Java:15) 
        at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.Java:43) 
        at nl.bravobit.ffmpeg.FFcommandExecuteAsyncTask.doInBackground(FFcommandExecuteAsyncTask.Java:12) 
        at Android.os.AsyncTask$3.call(AsyncTask.Java:378) 
        at Java.util.concurrent.FutureTask.run(FutureTask.Java:266) 
        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) 
2019-09-28 13:48:32.146 16041-16041/com.merger.cut E/FFMPEG :: on finish

上記の問題の解決策を教えてください。

6

Android QのFFMPEGを探しているなら、QここにFFMPEGビルドの下のリンク使用があります。これをapp/build.gradleに含めてください。

Min SDK 24

  dependencies {
        implementation 'com.arthenica:mobile-ffmpeg-full:4.3'
    }

Min SDK 16

dependencies {
    implementation 'com.arthenica:mobile-ffmpeg-full:4.2.2.LTS'
}

テスト済みOnePlus 7T
Android Q

2
Vinesh Chauhan

公式文書はありません。

https://www.reddit.com/r/androiddev/comments/b2inbu/psa_Android_q_blocks_executing_binaries_in_your/

ただし、以下の方法を使用してアプリをテストできます

Linux DACとSE-Androidの両方が、アプリケーションのプロセスによる「su」実行可能ファイルへのアクセスをブロックしているようです。

システムが強制モードで実行されているかどうか、つまりSE-Androidが有効になっているかどうかを確認します。これが本当に当てはまる場合は、次のコマンドを実行して一時的に無効にできます。

adb root

   adb Shell setenforce 0

これにより、SE-Androidが無効になり、アプリプロセスによる「su」の実行がブロックされなくなります。

だからあなたはffmpegを実行することができます

さらに、アプリには、ルートとして「su」を起動するために必要なDAC権限がない場合があります。次のコマンドを実行できます。

adb Shell ps

デバイスで実行中のすべてのプロセスのリストについて。 (パッケージ名を検索して)アプリを見つけ、そのグループとuidを確認します。ほとんどの場合、どちらもルートではありません。

カスタムのuserdebugイメージを構築することは、標準のAndroidデバイスをルート化することとはかなり異なります。デバッグバージョンは、デバイスの内部へのアクセスを許可しながら、実際に機能するデバイスすべてをシミュレーションすることを目的としていますデフォルトのセキュリティメカニズムが有効。

0
Vinesh Chauhan

このライブラリは最大sdk 28のみをサポートしているため、以下のリンクを参照してください。

https://github.com/bravobit/FFmpeg-Android/blob/master/Android-ffmpeg/build.gradle

したがって、このライブラリではtargetSdkVersion 28およびcompileSdkVersion 28。これを変更したい場合は、問題なく機能します。お役に立てれば幸いです。

0
Viral Patel