¿Cómo ejecutar los comandos ffmpeg de línea de comandos en el android?
He construido con éxito ffmpeg para android usando el bambuser . Ahora tengo que construir una aplicación de conversión de ejemplo como mp4 a 3gp. Sé que hay comandos de línea de comandos ffmpeg -i video_origine.avi video_finale.mpg
. Pero no sé cómo ejecutar estos comandos mediante programación. Tengo código de ejemplo como
jint Java_com_example_ndklearning1_MainActivity_logFileInfo(JNIEnv * env, jobject this, jstring filename) { av_register_all(); AVFormatContext *pFormatCtx; const jbyte *str; str = (*env)->GetStringUTFChars(env, filename, NULL); if(av_open_input_file(&pFormatCtx, str, NULL, 0, NULL)!=0) { LOGE("Can't open file '%s'\n", str); return 1; } else { LOGI("File was opened\n"); LOGI("File '%s', Codec %s", pFormatCtx->filename, pFormatCtx->iformat->name ); } return 0; }
Este código abre un archivo y extrae la información del códec. Todo lo que quiero es que, para convertir el archivo abierto en un formato deseado. Cualquier tipo de ayuda como fragmento de código o pasos a seguir será muy apreciada.
- SurfaceView en blanco al reproducir vídeo usinng mediaplayer
- Cómo crear ecualizador para android
- ¿Oiga el cambio de volumen?
- Cómo simular los botones de control de medios de hardware en un emulador de Android
- Android Media Grabación utilizando hilos
¿Puede ffmpeg API servir a mi propósito? Si existe una API disponible, será más útil
- Cómo guardar imágenes de la cámara en Android a la carpeta específica?
- Cómo evitar un retraso de 15 segundos / caché en Android Media Player al reproducir la secuencia
- Cómo rotar video * .mp4 en SurfaceView?
- Android: muestra el micrófono sin grabación para obtener la amplitud / nivel en vivo?
- Cómo determinar el ancho y la altura del video en Android
- Consultas de medios fallan en el navegador de Android
- Android - Transmisión adaptativa de velocidad de bits. (HLS) Calidad del flujo
- SetVideoSurfaceTexture ha fallado: -22 en mediaplayer
Recientemente me encontré con el problema similar. Mi solución es simular una línea de comandos en el programa Java.
En primer lugar, agrego una función al archivo "ffmpeg.c":
int cmd_simulation(int argc, const char** argv) { OptionsContext o = { 0 }; // int64_t ti; reset_options(&o, 0); av_log_set_flags(AV_LOG_SKIP_REPEATED); parse_loglevel(argc, argv, options); if(argc>1 && !strcmp(argv[1], "-d")){ run_as_daemon=1; av_log_set_callback(log_callback_null); argc--; argv++; } avcodec_register_all(); avfilter_register_all(); av_register_all(); avformat_network_init(); //show_banner(argc, argv, options); term_init(); parse_cpuflags(argc, argv, options); /* parse options */ parse_options(&o, argc, argv, options, opt_output_file); if (nb_output_files <= 0 && nb_input_files == 0) { show_usage(); av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name); exit_program(1); } if (nb_output_files <= 0) { av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n"); exit_program(1); } if (transcode() < 0) exit_program(1); //exit_program(0); return 7; }
De hecho, esta función es sólo una copia de la función principal con una pequeña modificación.
A continuación, cree una función nativa:
extern const char* cmd_simulation(int, const char**); JNIEXPORT int JNICALL Java_com_test_videowatermark_VideoUtil_test(JNIEnv * env, jobject object, jobjectArray strArray); JNIEXPORT int JNICALL Java_com_test_videowatermark_VideoUtil_test(JNIEnv * env, jobject object, jobjectArray strArray) { int arrayLength = (*env)->GetArrayLength(env, strArray); const char* args[arrayLength]; int i; for(i = 0; i < arrayLength; i++){ jstring jstr = (jstring)((*env)->GetObjectArrayElement(env, strArray, i)); args[i] = (*env)->GetStringUTFChars(env, jstr, 0); //strcpy(args[i], arg); //env->ReleaseStringUTFChars(jstr, arg); } const char** argv = args; return cmd_simulation(arrayLength, argv); }
Después de la compilación con ffmpeg, puede simular comandos excuting ffmpeg como:
private void executeCommand(){ String[] command = {"ffmpeg", "-i", "some video file name",}; int result = test(command); }
¡Espero que esto ayude!
EDITAR: Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_WHOLE_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale libswresample libavfilter LOCAL_MODULE := VideoUtilLib LOCAL_SRC_FILES := NativeVideoUtil.c ffmpeg.c ffmpeg_opt.c cmdutils.c ffmpeg_filter.c LOCAL_LDLIBS := -lz -llog include $(BUILD_SHARED_LIBRARY) include $(call all-makefiles-under,$(LOCAL_PATH))
Reemplace NativeVideoUtil.c con su archivo nativo.
- Sesión de manejo en android mientras se registra en el lado del servidor en php
- OpenCV instalador independiente opencv