FFmpeg – no puede encontrar ExecuteBinaryResponseHandler – Android / Java

Estoy tratando de hacer un módulo para reaccionar-nativo que va a cambiar un video en un gif. Tengo poca o ninguna experiencia con android studios / java, pero me encantaría saber más! Estoy usando esta biblioteca para convertir el video en un gif. Aquí está mi código:

package com.reactlibrary; import android.widget.Toast; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.github.hiteshsondhi88.libffmpeg.FFmpeg; public class RNGifMakerModule extends ReactContextBaseJavaModule { private final ReactApplicationContext reactContext; public RNGifMakerModule(ReactApplicationContext reactContext) { super(reactContext); this.reactContext = reactContext; } @Override public String getName() { return "RNGifMakerModule"; } @ReactMethod public void alert(String message) { Toast.makeText(getReactApplicationContext(), "Error", Toast.LENGTH_LONG).show(); String[] cmd = {"-i" , message , "Image.gif"}; conversion(cmd); } public void conversion(String[] cmd) { FFmpeg ffmpeg = FFmpeg.getInstance(this.reactContext); try { // to execute "ffmpeg -version" command you just need to pass "-version" ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() { @Override public void onStart() { } @Override public void onProgress(String message) { } @Override public void onFailure(String message) { } @Override public void onSuccess(String message) { } @Override public void onFinish() { } }); } catch (FFmpegCommandAlreadyRunningException e) { // Handle if FFmpeg is already running e.printStackTrace(); } } } 

Y me sale este error:

 Error:(43, 31) error: cannot find symbol class ExecuteBinaryResponseHandler 

Esto parece extraño, porque en la documentación de ffmpeg-android-java se dice que se usa casi exactamente el mismo código.

Generosidad

La recompensa se otorgará a usted si usted puede encontrar una manera de convertir un video.mp4 en un gif. No necesariamente tiene que usar FFmpeg , pero su solución tiene que trabajar con java / android studios.

En primer lugar debe init ffmpeg correctamente.

 FFmpeg ffmpeg = FFmpeg.getInstance(this.reactContext); // please add following method after ffmpeg.loadBinary(new FFmpegLoadBinaryResponseHandler() { @Override public void onFailure() { // probably your device not supported } @Override public void onSuccess() { // you should init flag here (isLoaded, isReady etc.) } 

Sólo después de onSuccess() puede trabajar con comandos.

Entonces compruebe la respuesta siguiente por LordNeckbeard.

Así que su código debe ser algo como esto:

 if (isFFmpegLoaded) { // ffmpeg.execute(commands from link from the answer) } 

Por favor, no olvide quitar todos los espacios de la cadena del comando y de la palabra "ffmpeg". Para mantener el comando más legible voy a recomendar a construir el comando como este:

 final String[] command = new String[11]; // example of the first command in the answer command[0] = "-y"; command[1] = "-ss"; command[2] = "30"; command[3] = "-t"; command[4] = "3"; command[5] = "-i"; command[6] = "-t"; command[7] = "filePath"; command[8] = "-vf"; command[9] = "fps=10,scale=320:-1:flags=lanczos,palettegen"; command[10] = "palette.png"; 

Asegúrese de que tiene permiso de almacenamiento para trabajar con el archivo sólo en caso de que esté trabajando en almacenamiento externo.

Basado en esta estrategia ffmpeg funciona bien para mí. ¡Gracias y buena suerte!

Actualizar:

En realidad no confío en esta línea:

 FFmpeg ffmpeg = FFmpeg.getInstance(this.reactContext); 

Parece que ffmpeg tuvo que usar el contexto de la aplicación

En primer lugar, debe utilizar: File – Invalidate Caches / Restart – Invalidar y reiniciar e intentar reimportar ExecuteBinaryResponseHan‌dler . Si el problema no se ha resuelto, puede probar el pequeño hack. Dentro de su proyecto crear paquete com.github.hiteshsondhi88.libffmpeg y la clase:

 public class ExecuteBinaryResponseHandler implements FFmpegExecuteResponseHandler { @Override public void onSuccess(String message) { } @Override public void onProgress(String message) { } @Override public void onFailure(String message) { } @Override public void onStart() { } @Override public void onFinish() { } } 

Debe ser como en la imagen:

Introduzca aquí la descripción de la imagen

A continuación, dentro de su archivo defaultConfig en el bloque multiDexEnabled true agregue multiDexEnabled true

Introduzca aquí la descripción de la imagen

Entonces usted será capaz de usar esa clase

  • Detectar una excepción de entrada errónea
  • Retrofit y Jackson y análisis de JSON
  • Una forma alternativa de mostrar imágenes en una aplicación para Android
  • ¿Qué es una buena práctica de tratar con algunas excepciones HTTP de tiempo de ejecución?
  • URLConnection con Cookies?
  • Buscar usuarios de Android en tu lista de contactos
  • ¿Cómo puedo habilitar afirmaciones a nivel de idioma en Android Runtime (ART)?
  • haciendo ViewHolder final en Adaptador de lista personalizada android
  • Java Android - setOnClickListener (View.OnClickListener) en el tipo View no es aplicable para los argumentos (nuevo OnClickListener () {})
  • Alarma programada para repetir cada minuto del reloj android
  • ¿Cómo instalar Google Play Services en el dispositivo Genymotion 6.0?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.