2012-08-10 3 views
7

Ho scaricato il codice di ritaglio video da github da this link.Ritaglio video Android via ffmpeg

Sta funzionando perfettamente per la prima volta, ma quando provo a eseguirlo per la seconda volta il codice si blocca senza eccezioni e poi di nuovo quando provo a eseguirlo per la terza volta dopo l'arresto anomalo! Qualcuno ha qualche idea per questo tipo di comportamento?

Sto anche sviluppando un'applicazione con un modulo di video di ritaglio. Lo apprezzerei davvero, se qualcuno potesse aiutarmi.

+1

Qualsiasi fortuna con facendo in modo che funzioni, sto affrontando lo stesso problema, ogni aiuto sarà apprezzato. Grazie .. –

+0

Sto affrontando lo stesso problema, Se l'hai risolto, per favore aiutami. Grazie –

+0

Cerca di non pulire il progetto, quindi funzionerà senza problemi. –

risposta

0

Penso che potresti terminare la tua attività e riavviare l'applicazione dopo la chiamata di trimming video nel codice.

Se dopo la seconda volta l'applicazione si arresta in modo anomalo e nel terzo funziona, le applicazioni potrebbero inizializzare e riavviare l'applicazione dopo il crash.

tenta di caricare e scaricare i nativi della biblioteca link

+0

puoi per favore riformulare la tua risposta Sto affrontando lo stesso problema come descritto nella domanda. –

+0

Ok, ci proverò. In VideoTrimmingService.java carichi la tua libreria nativa su OnCreate. Penso che se si riavvia l'attività dopo la prima volta che si ritaglia il video, la seconda volta non si bloccherà. Forse questo spiega perché la terza volta funziona, dovresti caricare la libreria ogni volta che la usi. –

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

letto circa il problema con vars statici in 'ffmpeg.c' ...

ci avrei scommesso che hai lo stesso problema e devi fare qualcosa (3 scelte alternative) per resettare o GC quelle varsette:

  1. ottenere il programma di caricamento classe Java che ha caricato il lib e GC è

  2. nel c-strato di fare ciò che il PO ha fatto nel link qui sopra

  3. scrivere la 2 ° lib condivisa che utilizza 'dlsym' e 'dlclose' sulla prima biblioteca durante ogni ciclo di chiamata

GitHub, vedere la 'README' here

stesso Sue che ur avendo

+0

Risposte eccellenti, il README di github link è stato utile, puoi fornire demo di esempio per le tue risposte 1, 2 e 3? La terza risposta fornita da OP è semplicemente simbolica e essendo un novizio in programmazione C non riesco a capire cosa sta facendo, quindi c'è qualche altro collegamento che lo spieghi meglio? –

+1

vai con 3. costruisci un secondo modulo condiviso in C che ottiene i vars nella stringa arrary per ffmpeg quindi usa dlsym per ottenere l'handle quindi chiama - Java_net_video_trimmer_natives_VideoTrimmer_trim e poi DOLCLOSE .. il dlclose cancella tutti i residui dalla prima chiamata. Il terzo link della mia storia ANS HAS CODE lo spiega. clonalo e guarda "ffmpeg_invoke" –

+0

Mi chiedo come hai fatto a dlclose a funzionare, in ndk-documentation afferma chiaramente che "I distruttori statici non vengono mai chiamati al momento, né all'uscita del programma, né quando viene chiamato dlclose()." FARE RIFERIMENTO AI DOCUMENTI DI SISTEMA nella vostra cartella ndk –

3

Basta fare un metodo nella ffmpeg.c che sarà sembra come questo metodo

void exitmycode(){ 
     ffmpeg_exit(0); 

} 

ffmpeg_exit(0) è già lì in ffmpeg.c basta chiamare exitmycode(); dal file principale C dopo la completamento del taglio del video.

Ora quello che stava succedendo è che quando si taglia un video o qualsiasi altra cosa con ffmpeg non si esce completamente, quindi la prossima volta che si esegue il comando si esce, ma non si esegue il trim command.Again se si esegue la terza volta, il comando viene eseguito perfettamente. Quindi, quello che ho fatto è chiamare lo ffmpeg_exit(0) manualmente alla fine dell'elaborazione.

+0

Penso che questo faccia uscire l'intera app, ad esempio includendo il codice di chiamata Java di Android? Inoltre, per quanto posso vedere, ffmpeg_exit() è stato sostituito con exit_program() nell'ultima sorgente ffmpeg. – Mick

-1

fare una cosa

Se avete installato ffmpeg4android_os lib, allora non vi resta che lasciare un commento, 1 riga del metodo StopTranscoding come questo

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

che tutti ....