2013-07-06 12 views
9

Requisito:

voglio sviluppare un app che ha ricodifica video con pausa e riprendere la funzione.

ho provato:

ho sviluppato l'applicazione fino ricodifica il video utilizzando la visualizzazione della superficie.

già eseguito tutte le ricerche:

Ho già cercato in tutto il sito e anche like ma fino ad ora non riesco a ottenere la soluzione e che so non v'è alcuna opzione di default in Android per la pausa e riprendi video e anche conoscendo unendo il video possiamo realizzarlo.

cosa ho bisogno:

prega di condividere me se non v'è alcun plugin esterno ad esso, mi guida come raggiungere questo obiettivo se si dispone già raggiunto, e mi ha anche condividere qualsiasi resouce che si è riferito a come per unire il video ..i hanno cercato, ma senza risorse corretto che avevo visto si prega di condividere qualsiasi cosa se si trova ..Come aggiungere mettere in pausa e riprendere la funzione, mentre ricodifica video nel Android

risposta

5

Finalmente trovo la risposta :)
ho una ricerca sulla ffmpeg sembra più a fondo un e qualche giorno in più scavando intorno a esso ma non posso ottenere la risorsa giusta
per ffmepg e provo a usare mp4parser lib e ho completato con successo il mio requisito.

Codice per la fusione multipla Video

public class MergeVide extends AsyncTask<String, Integer, String> { 

    @Override 
    protected void onPreExecute() { 
     progressDialog = ProgressDialog.show(Video.this, 
       "Preparing for upload", "Please wait...", true); 
     // do initialization of required objects objects here 
    }; 

    @Override 
    protected String doInBackground(String... params) { 
     try { 
      String paths[] = new String[count]; 
      Movie[] inMovies = new Movie[count]; 
      for (int i = 0; i < count; i++) { 
       paths[i] = path + filename + String.valueOf(i + 1) + ".mp4"; 
       inMovies[i] = MovieCreator.build(new FileInputStream(
         paths[i]).getChannel()); 
      } 
      List<Track> videoTracks = new LinkedList<Track>(); 
      List<Track> audioTracks = new LinkedList<Track>(); 
      for (Movie m : inMovies) { 
       for (Track t : m.getTracks()) { 
        if (t.getHandler().equals("soun")) { 
         audioTracks.add(t); 
        } 
        if (t.getHandler().equals("vide")) { 
         videoTracks.add(t); 
        } 
       } 
      } 

      Movie result = new Movie(); 

      if (audioTracks.size() > 0) { 
       result.addTrack(new AppendTrack(audioTracks 
         .toArray(new Track[audioTracks.size()]))); 
      } 
      if (videoTracks.size() > 0) { 
       result.addTrack(new AppendTrack(videoTracks 
         .toArray(new Track[videoTracks.size()]))); 
      } 

      BasicContainer out = (BasicContainer) new DefaultMp4Builder() 
        .build(result); 

      @SuppressWarnings("resource") 
      FileChannel fc = new RandomAccessFile(String.format(Environment 
        .getExternalStorageDirectory() + "/wishbyvideo.mp4"), 
        "rw").getChannel(); 
      out.writeContainer(fc); 
      fc.close(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     String mFileName = Environment.getExternalStorageDirectory() 
       .getAbsolutePath(); 
     mFileName += "/wishbyvideo.mp4"; 
     filename = mFileName; 
     return mFileName; 
    } 

    @Override 
    protected void onPostExecute(String value) { 
     super.onPostExecute(value); 
     progressDialog.dismiss(); 
     Intent i = new Intent(Video.this, VideoUpload.class); 
     i.putExtra("videopath", value); 
     i.putExtra("id", id); 
     i.putExtra("name", name); 
     i.putExtra("photo", photo); 
     startActivity(i); 
     finish(); 
     } 
} 


il conteggio non è altro che il numero di file di video.

il codice precedente per unire più video e inviare il codice finale a un'altra attività in cui ho deciso di visualizzare l'anteprima del video.
prima di utilizzare il codice precedente, assicurarsi di utilizzare mp4parser lib.

+0

Hey Karthi, ho provato a usare questo codice. Genera errore e mi consiglia di eseguire il cast con DataSource, dopo averlo lanciato genera ClassCastException su questa riga: inMovies [i] = MovieCreator.build ((DataSource) nuovo FileInputStream ( percorsi [i]). GetChannel()); Poi ho sostituito il percorso senza canale e FileInputStream in quanto accetta anche file di stringhe dirette, ma anche i video, ma non riesce a giocare e si unisce in modo errato. Puoi dirmi la versione del barattolo che hai usato cercherò di sostituire con quello. Inoltre, per favore dimmi come non lanciare DataSource. Gentilmente fammi sapere. Grazie. – iabhi

+0

Bene ho ottenuto un'eccezione "java.io.IOException: impossibile aggiungere Mp4TrackImpl {handler = 'vide'} a Mp4TrackImpl {handler = 'vide'} poiché le loro caselle Descrizione del campione differiscono:" durante l'aggiunta di questo. se (videoTracks.size()> 0) { risultato.addTrack (nuovo AppendTrack (videoTracks .toArray (new Track [videoTracks.size()]))); } –

+0

@karthi puoi dirci cos'è BasicContainer? – duggu