我将 ffmpeg android 库用于边缘水印和视频。我一次又一次地面临这个问题。提到波纹管-
2023-04-08 14:05:02.892 20450-20637/com.projectname E/FFmpeg: 尝试运行时出现异常:[Ljava.lang.String;@bc435e7 java.io.IOException:无法运行程序“/data/user/0/com.projectname/files/ffmpeg”:错误=13,权限 拒绝 在 java.lang.ProcessBuilder.start(ProcessBuilder.java:1050) 在 java.lang.Runtime.exec(Runtime.java:694) 在 java.lang.Runtime.exec(Runtime.java:559) 在 com.github.hiteshsondhi88.libffmpeg.ShellCommand.run(ShellCommand.java:10) 在 com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:38) 在 com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:10) 在 android.os.AsyncTask$3.call(AsyncTask.java:394) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:920) 引起:java.io.IOException: error=13, Permission denied 在 java.lang.UNIXProcess.forkAndExec(本机方法) 在 java.lang.UNIXProcess.(UNIXProcess.java:133) 在 java.lang.ProcessImpl.start(ProcessImpl.java:141) 在 java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) 在 java.lang.Runtime.exec(Runtime.java:694) 在 java.lang.Runtime.exec(Runtime.java:559) 在 com.github.hiteshsondhi88.libffmpeg.ShellCommand.run(ShellCommand.java:10) 在 com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:38) 在 com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:10) 在 android.os.AsyncTask$3.call(AsyncTask.java:394) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 在 java.lang.Thread.run(Thread.java:920)
val file = File(
Environment.getExternalStorageDirectory()
.toString() + File.separator + ""
+ System.currentTimeMillis() + ".png"
)
try {
file.createNewFile()
val saveSettings: SaveSettings = SaveSettings.Builder()
.setClearViewsEnabled(true)
.setTransparencyEnabled(false)
.build()
mPhotoEditor?.saveAsFile(file.absolutePath, saveSettings, object : PhotoEditor.OnSaveListener {
override fun onSuccess(@NonNull imagePath: String) {
[email protected] = imagePath
binding.ivImage.source.setImageURI(Uri.fromFile(File(imagePath)))
val output = File((Environment.getExternalStorageDirectory().toString() + File.separator + "" + System.currentTimeMillis() + ".mp4"))
try {
output.createNewFile()
exeCmd?.apply {
add("-y")
add("-i")
add(videoPath)
add("-i")
add(imagePath)
add("-filter_complex")
add("[1:v]scale=$DRAW_CANVASW:$DRAW_CANVASH[ovrl];[0:v][ovrl]overlay=x=0:y=0")
add("-c:v")
add("libx264")
add("-preset")
add("ultrafast")
add(output.absolutePath)
}
newCommand = arrayOfNulls(exeCmd?.size!!)
for (j in exeCmd!!.indices) {
newCommand[j] = exeCmd!![j]
}
executeCommand(newCommand, output.absolutePath)
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
}
override fun onFailure(exception: Exception) {
Toast.makeText(
requireContext(),
"Saving Failed...",
Toast.LENGTH_SHORT
).show()
}
})
} catch (e: IOException) {
e.printStackTrace()
}
private fun executeCommand(command: Array<String?>?, absolutePath: String?) {
try {
fFmpeg?.execute(command, object : FFmpegExecuteResponseHandler {
override fun onSuccess(s: String) {
Log.d("CommandExecute", "onSuccess $s")
Toast.makeText(context, "Success", Toast.LENGTH_SHORT).show()
//todo when Command executing successfully run then navigate next page
}
override fun onProgress(s: String) {
progressDialog?.setMessage(s)
Log.d("CommandExecute", "onProgress $s")
}
override fun onFailure(s: String) {
Log.d("CommandExecute", "onFailure $s")
progressDialog?.hide()
}
override fun onStart() {
progressDialog?.setTitle("Precessing")
progressDialog?.setMessage("Starting")
progressDialog?.show()
}
override fun onFinish() {
progressDialog?.hide()
}
})
} catch (e: FFmpegCommandAlreadyRunningException) {
e.printStackTrace()
}
}
请尽快回复我!我试着在 1 周内找到问题。请告诉我解决问题的方法。