2012-12-06 14 views
11

In entrambi i casi funziona bene sull'emulatore (2.3.3), ma su un dispositivo reale (Nexus S con 4.1.2) non viene visualizzata alcuna immagine per la miniatura. Cercherò anche di eseguirlo su un Android 4 Emulator. Se imposto un valore predefinito android:src per ImageView, non viene più visualizzato. Questo mi fa pensare che sia stato sostituito, ma lo ImageView è vuoto.È possibile visualizzare una miniatura del video da un URL su Android 4 e versioni successive?

public class MainActivity extends Activity { 

    ImageView img; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     img = (ImageView)findViewById(R.id.img_thumbnail); 
     new MyAsync().execute("http://commonsware.com/misc/test.mp4"); 
    } 

    //This version is still not working, but it's more readable (edited: Selvin). 
    public class MyAsync extends AsyncTask<String, Void, Bitmap>{ 

     @Override 
     protected Bitmap doInBackground(String... objectURL) { 
      //return ThumbnailUtils.createVideoThumbnail(objectURL[0], Thumbnails.MINI_KIND); 
      return ThumbnailUtils.extractThumbnail(ThumbnailUtils.createVideoThumbnail(objectURL[0], Thumbnails.MINI_KIND), 100, 100); 
     } 

     @Override 
     protected void onPostExecute(Bitmap result){ 
      img.setImageBitmap(result); 
     } 
    } 
} 

so che una domanda simile è stato chiesto prima, Displaying video thumbnails in an Android device from a remote video URL, ma ho già provato questo e lo stesso risultato.

Perché questo non funziona sul dispositivo e come farlo funzionare?

+2

definire non funziona ... alcun log logcat? – Selvin

+0

@Selvin No..no LogCat – AlexAndro

+0

quindi bmThumbnail è nullo dopo l'estrazione? prova a chiamare estratto in AsyncTask ... – Selvin

risposta

2

Usa FFmpegMediaMetadataRetriever per estrarre una miniatura nella posizione desiderata: FFmpegMediaMetadataRetriever

+1

Ho provato la tua libreria e funziona. Usando il codice di esempio dalla descrizione, 'Bitmap b = mmr.getFrameAtTime (2000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);' funziona! Il 'byte [] artwork = mmr.getEmbeddedPicture();' restituisce comunque 'null'. – AlexAndro

+0

Troppo laggy Sto ancora cercando un metodo fattibile per ottenere le miniature di un file locale il percorso del file o uri – Lion789

+0

la dimensione di questa libreria è di quasi 25 MB! –

0

Questo non è possibile su Android e Java e per quanto ne so altre lingue senza scaricare l'intero video (correggimi se ho torto). È giusto che YouTube e qualsiasi altro servizio di video di grandi dimensioni forniscano una semplice API per ottenere un pollice video. Quindi se il server in cui risiedono i video non supporta questo tipo di API chiama il tuo in caso di sfortuna.

+0

In realtà i miei video risiedono su Amazon. Forniscono un tale tipo di API. Con il metodo descritto sopra, sono riuscito a generare oltre 500 miniature su un emulatore Android 2.3 in circa 2 ore utilizzando un thread ricorsivo. Che i video abbiano più di 32 GB quindi ... Non so come funziona esattamente l'emulatore dietro la scena, ma suppongo che osserverei un tale spazio di occupazione della memoria se lo scaricassi. Forse era qualcosa di temporaneo, non so cosa dire, ma certamente ha funzionato su 2.3 e non funziona su Android 4+. – AlexAndro

+0

Ecco un breve pezzo del mio lavoro, in cui ho utilizzato l'API di Amazon per accedere ai video: http: // StackOverflow.it/questions/13287233/how-to-play-a-video-da-amazon-s3-in-android-app – AlexAndro

+0

@AlexAndro beh, l'unica cosa che sono riuscito a trovare nella documentazione per generare i pollici dai video è MediaStore.Video.Thumbnails e funziona solo per l'archiviazione interna ed esterna. Se la tua soluzione precedente soddisfa le tue esigenze, direi sentitevi liberi di usarla: scarica il video 1 alla volta e genera il pollice e poi cancella di nuovo il video: S <- mi sembra davvero stupido. – Warpzit

0

Si è verificato lo stesso problema su 2.3 quando si è tentato di creare un'anteprima dal file che si trovava nella cartella della cache. Impostazione bandiere autorizzazione risolto il problema:

videoFile.setReadable(true, false); 
+3

Su 2,3 ​​funziona, il problema è su 4+ per i video online. – AlexAndro