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:
- ¿Es posible ejecutar pruebas de unidad de Android Espresso en métodos anotados @BeforeClass?
- Método sincronizado de Java
- ¿Cómo puedo comprobar si una aplicación se ejecuta en Android?
- 'Debe sustituir un método de superclase' Errores después de importar un proyecto en Eclipse
- ¿Cómo restablecer los logros en Google Play Games?
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.
- No se puede conectar mediante httpconnection en android
- Acceda al objeto JNI a la capa de Java como puntero de referencia
- Conector TLS-PSK de Java
- ¿Cómo puedo borrar automáticamente el texto en EditText?
- ¿Cómo puede una aplicación Android funcionar como un controlador remoto a una aplicación de escritorio? (Spotify)
- Cómo convertir una cadena UTF a ANSI y crear un archivo de texto ANSI en SSD con JAVA-ANDROID
- Cómo cancelar una solicitud http
- ¿Cómo leer y escribir datos en puertos COM / Serial en Android?
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 ExecuteBinaryResponseHandler
. 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:
A continuación, dentro de su archivo defaultConfig
en el bloque multiDexEnabled true
agregue multiDexEnabled true
Entonces usted será capaz de usar esa clase
- No se puede hacer que la vista de niño sea más amplia que la de padre en Disposición de Android
- Botón androide con bordes de medio círculo