2012-08-10 21 views
7

He descargado el código de recorte de video de github desde this link.Recorte de video Android a través de ffmpeg

Está funcionando perfectamente por primera vez, pero cuando intento ejecutarlo por segunda vez, el código se bloquea sin excepción, cuando trato de ejecutarlo por tercera vez después del bloqueo. ¿Alguien tiene alguna idea para este tipo de comportamiento?

También estoy desarrollando una aplicación que tiene un módulo de recorte de videos. Realmente lo apreciaría, si alguien pudiera ayudarme.

+1

Ha habido suerte con Para que esto funcione, estoy enfrentando el mismo problema, cualquier ayuda será apreciada. Gracias .. –

+0

Estoy enfrentando el mismo problema, si lo resolvió, por favor, ayúdenme. Gracias –

+0

Trate de no limpiar el proyecto, luego se ejecutará sin ningún problema. –

Respuesta

0

Creo que puede finalizar su actividad y reiniciar la aplicación después de su llamada de recorte de video en el código.

Si después de la segunda vez la aplicación se bloquea y en el tercero funciona, tal vez las aplicaciones se inicialicen y reinicien la aplicación después de su bloqueo.

Trata de carga y descarga de los nativos de la biblioteca link

+0

¿puede por favor reformular su respuesta? Estoy enfrentando el mismo problema que se describe en la pregunta. –

+0

Ok, lo intentaré. En VideoTrimmingService.java, carga su biblioteca nativa en OnCreate. Creo que si reinicias la actividad después de la primera vez que recortas tu video, la segunda vez no se bloqueará. Quizás esto explique por qué funciona la tercera vez, debería cargar la biblioteca cada vez que la usa. –

4

https://lists.ffmpeg.org/pipermail/libav-user/2012-May/001964.html

Calling native method twice of third party library in an Activity causes the Android application to close down

leído sobre el tema con vars estáticos en 'ffmpeg.c' ...

apostaría que tiene el mismo problema y necesita hacer algo (3 elecciones alternativas) para reiniciar o GC esos valores:

  1. obtener el cargador de clases de Java que carga el lib y GC se

  2. en el c-capa de hacer lo que el PO hizo en el enlace de arriba

  3. escribir una librería compartida segundo que utiliza 'dlsym' y 'dlclose' en la primera biblioteca durante cada ciclo de llamadas

github, ver la 'README' here

mismo es Sue que ur tener

+0

Respuestas excelentes amigo, el README del enlace github fue útil, ¿pueden dar muestras de demos para sus respuestas 1, 2 y 3? La tercera respuesta dada por OP es meramente simbólica y al ser un novato en la programación de C no puedo entender lo que está haciendo, ¿hay algún otro enlace que lo explique mejor? –

+1

ve con 3. construye un segundo módulo compartido en C que obtiene los vars en cadena arrary para ffmpeg luego usa dlsym para obtener el manejador luego llama - Java_net_video_trimmer_natives_VideoTrimmer_trim y luego HACE DLCLOSE .. el archivo borra todos los residuos de la primera llamada. El tercer enlace en mi original ANS HAS CODE explica en él. clonarlo y mirar 'ffmpeg_invoke' –

+0

Me pregunto cómo consiguió que dlclose funcione, en ndk-documentation se establece claramente que "los destructores estáticos nunca se llaman en este momento, ya sea al salir del programa, o cuando se llama a dlclose()". Véase el documento SISTEMA DE-PROBLEMAS en la carpeta de NDK –

3

Sólo hacer un método en su ffmpeg.c la que se parece este método

void exitmycode(){ 
     ffmpeg_exit(0); 

} 

ffmpeg_exit(0) ya está ahí en el ffmpeg.c sólo hay que llamar exitmycode(); de su archivo principal C después de la finalización de recorte de video.

Ahora lo que sucedía es que cuando recorta un video o cualquier otra cosa con el ffmpeg no obtiene la salida por completo, por lo que la próxima vez que ejecute el comando se saldrá, pero tampoco ejecutará el recorte comando. Otra vez si ejecuta esa tercera vez, el comando se ejecuta perfectamente. Entonces, lo que hice fue llamar al ffmpeg_exit(0) manualmente al finalizar el procesamiento.

+0

Creo que esto hace que toda la aplicación salga, es decir, que incluya el código de llamada de Android Java. Además, hasta donde puedo ver, ffmpeg_exit() ha sido reemplazado por exit_program() en la última fuente de ffmpeg. – Mick

-1

hacer una cosa

si ha instalado ffmpeg4android_os lib continuación, sólo tiene que comentar 1 línea del Método StopTranscoding como esto

public void stopTranscoding() { 
     Log.d(Prefs.TAG, "stopTranscoding called"); 
     if (_transcodeBackground != null) { 
      //_transcodeBackground.forceCancel(); 
     } 
    } 

que todos ....

Cuestiones relacionadas