2011-11-15 17 views
11

Ben çalmakta videonun ekran görüntüsünü almak için çalışıyorum. Web görünümünün ekran görüntüsünü başarılı bir şekilde alan ancak şu anda oynatılmakta olan videonun fotoğrafını çekerken başarıya ulaşamayan kodla çalışıyorum.Şu anda oynatılan videonun ekran görüntüsünü nasıl alırsınız?

web görünümü için takip kodu.

WebView w = new WebView(this); 

w.setWebViewClient(new WebViewClient() 
{ 
    public void onPageFinished(WebView view, String url) 
    { 
     Picture picture = view.capturePicture(); 
     Bitmap b = Bitmap.createBitmap(picture.getWidth(), 
     picture.getHeight(), Bitmap.Config.ARGB_8888); 

     Canvas c = new Canvas(b); 

     picture.draw(c); 

     FileOutputStream fos = null; 

     try { 
      fos = new FileOutputStream("/sdcard/yahoo_" +System.currentTimeMillis() + ".jpg"); 

      if (fos != null) 
      { 
       b.compress(Bitmap.CompressFormat.JPEG, 90, fos); 

       fos.close(); 
      } 

     } catch(Exception e) 
     { 
      //... 
     } 
    } 
}); 

setContentView(w); 

w.loadUrl("http://www.yahoo.com"); 
+1

Ne yazık ki, bu Gingerbread/Honeycomb mümkün olduğunu sanmıyorum. Video, Canvas/Bitmap açılanmasına dönüştürülemeyen ayrı bir Yüzeyde görüntülenir. Bu emin değilim, ancak Ice Cream Sandwich içinde TextureView API'leri ile mümkün olabilir. – mportuesisf

+0

doğru olabilir ama yine de bunu arşivlemeye yakınım için r & d yapmam gerekiyor, ekranın kök görüntüsünü alıyorum ama şimdiki görünümü almıyorum. – milind

cevap

1

kolay Çözeltisi (Ama her zaman çalışacağı garanti değil): İstenen çıktıyı almak için değiştirebilir başka SO question den MediaMetadataRetriever

Çözüm. Çerçeveyi almak için bu zamanı yakalamak ve MediaMetadataRetriever'e geçmek istediğiniz zamanı milisaniye olarak bulun.

O kadar kolay Çözeltisi (Daima desteklenir, işe codec'i koşuluyla): FFMPEG

1

FFmpegMediaMetadataRetrieverMediaMetadataRetriever aynı arayüze sahip ama arka uç olarak FFmpeg kullanır 66CLSjY en yanıta genişletmek için. Varsayılan konfigürasyon video formatınızla çalışmazsa, yeniden derlenerek kodekleri etkinleştirebilir/devre dışı bırakabilirsiniz.

FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever(); 
mmr.setDataSource(mUri); 
mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_VIDEO_CODEC); 
Bitmap b = getFrameAtTime(3000); 
mmr.release(); 
0

View v = view.getRootView(); 
v.setDrawingCacheEnabled(true); 
Bitmap b = v.getDrawingCache(); 
0

Bu benim için çalışıyor o olacak bu uygulama ekranı için bit eşlem verir deneyin:

Öncelikle bir yöntem haline görünümünüzü dönüştürmek için İşte bazı örnek kod bitmap

public static Bitmap getBitmapFromView(View view) { 

    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(),view.getHeight(),Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(returnedBitmap); 
    Drawable bgDrawable =view.getBackground(); 
    if (bgDrawable!=null) 
     bgDrawable.draw(canvas); 
    else 
     canvas.drawColor(Color.WHITE); 
    view.draw(canvas); 
    return returnedBitmap; 
} 

Ardından SD'ye kaydedin, örnek: le:

static private boolean saveImage(Bitmap bm, String absolutePath) 
{ 
    FileOutputStream fos = null; 
    try 
    { 
    String absolutePath = "your path" 
     File file = new File(absolutePath); 
     fos = new FileOutputStream(file); 
     bm.compress(Bitmap.CompressFormat.PNG, 100, fos); //PNG ignora la calidad 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     try 
     { 
      if (fos != null) 
       fos.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    return true; 
} 

Good Luck!

İlgili konular