Merge video images with FFMPEG Library android [错误]

问题描述 投票:0回答:0

我将 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 周内找到问题。请告诉我解决问题的方法。

android kotlin android-ffmpeg
© www.soinside.com 2019 - 2024. All rights reserved.