2014-03-11 10 views
5

Ich habe es bereits geschafft, ein Thumbnail aus meinem Video zu erstellen. Der Code sieht wie folgt aus:Android Erstelle Video Thumbnail zu einer bestimmten Zeit

videoGalleryThumbnails.add(ThumbnailUtils.extractThumbnail(ThumbnailUtils.createVideoThumbnail(
        videoFile.getAbsolutePath(), MediaStore.Images.Thumbnails.MINI_KIND), 500, 200)); 

Aber die erzeugte Thumbnail in einem wirklich schlechten Zeit. Es ist genau dann, wenn das Video schwarz ist. Jetzt habe ich kein komplett schwarzes Thumbnail mehr.

Wie kann ich ein Thumbnail meines Videos zu einer bestimmten Zeit aufnehmen? Z.B. um 00:31 oder um 01:44?

Oder ist es nicht möglich?

Ich habe auch versucht, MediaMetadataRetriever zu verwenden, aber ich bekomme nur ein weißes Bild. Code wie dies

File tempVideoList[] = (Environment.getExternalStoragePublicDirectory(PATH_VIDEO_GALLERY)) 
      .listFiles(); 
MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
Bitmap myBitmap=null; 
for (File videoFile : tempVideoList) { 
    if (videoFile.isFile()) { 
     //from here 
     try { 
      retriever.setDataSource(videoFile.getAbsolutePath()); 
      myBitmap = retriever.getFrameAtTime(11); //at 11th second 
     } catch (Exception ex) { 
      Log.i("MyDebugCode", "MediaMetadataRetriever got exception:" + ex); 
     } 

    videoGalleryThumbnails.add(myBitmap); 
    //to here 
} 

sieht Wenn ich den Code markiert als „von hier“ auf „here“ mit dem oberen ersten Code zu ersetzen, es funktioniert. Ich habe auch versucht, MediaMetadataRetriever.OPTION_CLOSEST und OPTION_CLOSEST_SYNC und OPTION_NEXT_SYNC.

+1

Können Sie die videoFile-Deklaration überprüfen und freigeben? –

+0

Ich habe meinen Code bearbeitet, damit Sie die Deklaration sehen. Es scheint soweit in Ordnung zu sein. – qweret

Antwort

4

Ok ich habe es. Der MediaMetadataRetriever war absolut der richtige Weg. Das Problem ist, dass es die Zeit in Mikrosekunden und nicht in Sekunden zählt. Lösung sieht wie folgt aus:

try { 
     retriever.setDataSource(videoFile.getAbsolutePath()); 
     int timeInSeconds = 30; 
     myBitmap = retriever.getFrameAtTime(timeInSeconds * 1000000, 
        MediaMetadataRetriever.OPTION_CLOSEST_SYNC); 
    } catch (Exception ex) { 
     Log.i("MyDebugCode", "MediaMetadataRetriever got exception:" + ex); 
    } 

videoGalleryThumbnails.add(myBitmap); 

Ich weiß nicht, ob OPTION_CLOSEST_SYNC tatsächlich benötigt wird, aber es sieht aus wie dies der bessere Weg für die Programmierung ist.

Danke an William Riley, dass er mich in die richtige Richtung weist.

0

benötigen wenig Änderungen für diesen Code:

try { 

    MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 

// haben die Version für die setDataSource steuern

if (Build.VERSION.SDK_INT >= 14) 
     retriever.setDataSource(video_path, new HashMap<String, String>()); 
    else 
     retriever.setDataSource(video_path); 
    int timeInSeconds = 5; 
    Bitmap thumb = retriever.getFrameAtTime(timeInSeconds * 1000000, 
           MediaMetadataRetriever.OPTION_CLOSEST_SYNC); 
    imageViewThumb.setImageBitmap(thumb); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

wenn wir für "setDataSource" nicht die Version steuern dann Wir werden Ausnahmen bekommen. für mich funktionierte es nicht bis Versionskontrolle.

Verwandte Themen