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.
3 Réponses :
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
la bibliothèque a écrit pour l'API min 24 dans le manifeste
@MortezaKhodaie Veuillez consulter la documentation pour la version LTS Versions LTS
Essaye ça
dépendances {
implémentation 'com.arthenica: mobile-ffmpeg-full: 4.4.LTS'
}
Voir aussi ceci ..ffmpeg-video-editor-android
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.
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") }
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
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