2011-11-15 14 views
11

Estoy tratando de tomar una captura de pantalla del video que se está reproduciendo actualmente. Estoy intentando con un código que toma una captura de pantalla de la vista web con éxito, pero no tiene éxito al tomar una foto del video que se está reproduciendo actualmente.cómo tomar la captura de pantalla del video que se está reproduciendo actualmente?

El código sigue para la vista web.

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

Desafortunadamente, no creo que esto sea posible en Gingerbread/Honeycomb. El video se muestra en una superficie separada que no se puede procesar en un combo Canvas/Bitmap. Esto podría ser posible con las API TextureView en Ice Cream Sandwich, aunque no estoy seguro. – mportuesisf

+0

puede que tengas razón, pero aún tengo que hacer actividades de I + D porque estoy cerca de archivar esto, obtengo una vista de la raíz de la pantalla pero no obtengo la vista actual. – milind

Respuesta

1

solución más sencilla (pero no se garantiza que funcione siempre): MediaMetadataRetriever

Solución de otro SO question que se puede modificar para obtener la salida deseada. Encuentre el tiempo en milisegundos que desea capturar y pase esta vez a MediaMetadataRetriever para obtener el marco.

No es tan fácil solución (siempre funcionará, siempre y cuando el códec está soportado): FFMPEG

1

Para ampliar la respuesta de 66CLSjY, FFmpegMediaMetadataRetriever tiene la misma interfaz que MediaMetadataRetriever pero utiliza FFmpeg como backend. Si la configuración predeterminada no funciona con su formato de video, puede habilitar/deshabilitar códecs recompilando. Aquí hay un código de ejemplo:

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

intente esto lo hará da mapa de bits para la pantalla de su aplicación

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

Esto funciona para mí:

En primer lugar un método para convertir su visión en una mapa de bits

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; 
} 

A continuación, guarde en la tarjeta SD, por ejemplo 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; 
} 

¡Buena suerte!

Cuestiones relacionadas