3
votes

Les commandes FFMPEG ne fonctionnent pas sur Android 10

Je travaille sur une application Android appliquant des effets vidéo tels que des mouvements lents et rapides. Mon application fonctionne bien sous Android 10, mais pas sur Android 10 et FFMPEG n'affiche aucune erreur, juste un message d'erreur vide sur la méthode de rappel onFailure.

J'ai fait des recherches et j'ai découvert qu'Android a introduit des autorisations étendues et vous pouvez temporairement contourner cela en ajoutant cette ligne sur le manifeste android: requestLegacyExternalStorage = "true" et vous obtenez l'autorisation de stockage. Après avoir ajouté cette ligne, la portation de l'application fonctionne correctement pour récupérer les vidéos des utilisateurs, etc., mais FFMPEG ne fonctionne pas.

Si quelqu'un a une idée ou un indice sur ce problème, veuillez m'aider.


6 commentaires

Peut-être que FFmpeg ne fonctionne pas sur Android 10, va directement à onFailure (String message) avec un message vide sera utile.


en fait, il dit que FFmpeg exécute sur le répertoire de base et Android 10 a supprimé l'autorisation d'exécution pour le répertoire de base de l'application. Cela ressemble à une impasse jusqu'à présent.


stackoverflow.com/a/59686838/8416317


merci pour le lien, ces rappels de bibliothèque fonctionnent d'une manière différente mais je vais essayer cela


J'ai le même problème.


ou consultez github.com/alexcohn/FFmpeg-Android/tree/pull_request_Q et github.com/bravobit/FFmpeg-Android/issues/126


3 Réponses :


3
votes

voici une version de travail pour les appareils compatibles à partir de l'API 16 minimum. Prise en charge de l'API Android 29 (Q)

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

Packages de support à long terme pour MobileFFmpeg v4.4

Prend en charge les spécifications de périphérique suivantes

Android

Android 4.1 (niveau d'API 16) ou version ultérieure

architectures x86 et x86-64 arm-v7a, arm-v7a-neon, arm64-v8a,

Vous pouvez trouver plus d'informations sur le repo officiel sur github


2 commentaires

la bibliothèque a écrit pour l'API min 24 dans le manifeste


@MortezaKhodaie Veuillez consulter la documentation pour la version LTS Versions LTS



0
votes

Essaye ça

dépendances {

implémentation 'com.arthenica: mobile-ffmpeg-full: 4.4.LTS'

}

Voir aussi ceci ..ffmpeg-video-editor-android


2 commentaires

la bibliothèque a écrit pour l'API min 24 dans le manifeste


cette bibliothèque augmente la taille de l'apk à 64 Mo de plus.



0
votes

Utilisez cette bibliothèque qui prend en charge targetSdkVersion 29.

implémentation 'com.arthenica: mobile-ffmpeg-video: 4.4'

Commande utilisée pour la compression vidéo:

val complexCommand = arrayOf ("-y", "-i", inputPath !!, "-s", "640x480", "-r", "25", "-vcodec", "mpeg4", "-b: v "," 1000k "," -b: a "," 48000 "," -ac "," 2 "," -ar "," 22050 ", outputFilePath)

Méthode de compression:

execFFmpegBinary(complexCommand, inputPath, listener, outputFilePath)

Écouteur de compression:

 interface CompressionListener {
    fun compressionFinished(
        status: Int,
        isVideo: Boolean,
        fileOutputPath: String?
    )

    fun onFailure(message: String?)
    fun onProgress(progress: Int)
}

Appel en utilisant:

  private fun execFFmpegBinary(command: Array<String>, inputPath: String?, listener: CompressionListener?, outputFilePath: String) {
    Config.enableLogCallback { message -> Log.e(Config.TAG, message.text) }
    Config.enableStatisticsCallback { newStatistics ->
        Log.e(
            Config.TAG,
            String.format(
                "frame: %d, time: %d",
                newStatistics.videoFrameNumber,
                newStatistics.time
            )
        )
        Log.d(
            TAG,
            "Started command : ffmpeg " + Arrays.toString(command)
        )
        
        val videoLength = inputPath?.let { VideoUtils.getVideoDuration(it) }
        Log.d(TAG, "execFFmpegBinary: Video Length : $videoLength")
        val progress: Float =
            java.lang.String.valueOf(newStatistics.time).toFloat() / videoLength!!
        val progressFinal = progress * 100
        Log.d(TAG, "Video Length: $progressFinal")
        Log.d(
            Config.TAG,
            java.lang.String.format(
                "frame: %d, time: %d",
                newStatistics.videoFrameNumber,
                newStatistics.time
            )
        )
        Log.d(
            Config.TAG,
            java.lang.String.format(
                "Quality: %f, time: %f",
                newStatistics.videoQuality,
                newStatistics.videoFps
            )
        )
        //progressDialog.setProgress(progressFinal.toInt())
        //val adjustProgress = progressFinal/1.5f
        Log.d(TAG, "execFFmpegBinary: Progress: ${progressFinal.toInt()}")
        listener?.onProgress(progressFinal.toInt())
        Log.d(TAG, "progress : $newStatistics")
    }
    Log.d(
        TAG,
        "Started command : ffmpeg " + Arrays.toString(command)
    )
   /* progressDialog.setMessage("Processing...")
    progressDialog.show()*/
    val executionId = com.arthenica.mobileffmpeg.FFmpeg.executeAsync(
        command
    ) { executionId1: Long, returnCode: Int ->
        if (returnCode == RETURN_CODE_SUCCESS) {
            Log.d(
                TAG,
                "Finished command : ffmpeg " + Arrays.toString(command)
            )

            listener?.compressionFinished(SUCCESS, true, fileOutputPath = outputFilePath)
        } else if (returnCode == Config.RETURN_CODE_CANCEL) {
            Log.e(
                TAG,
                "Async command execution cancelled by user."
            )
            listener?.onFailure(String.format(
                "Async command execution cancelled by user."
            ))
            //if (progressDialog != null) progressDialog.dismiss()
        } else {
            Log.e(
                TAG,
                String.format(
                    "Async command execution failed with returnCode=%d.",
                    returnCode
                )
            )
            listener?.onFailure(String.format(
                "Async command execution failed with returnCode=%d.",
                returnCode
            ))
           // if (progressDialog != null) progressDialog.dismiss()
        }
    }
    Log.e(TAG, "execFFmpegMergeVideo executionId-$executionId")
}


2 commentaires

cette bibliothèque augmente la taille de l'apk à 64 Mo de plus.


Vous pouvez utiliser split apk comme celui-ci dans build.gradle pour réduire la taille. Vérifiez ceci: developer.android.com/studio/build/configure-apk-splits.html