2011-11-15 17 views
11

現在再生中のビデオのスクリーンショットを撮ろうとしています。私は正常に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

残念ながら、私はこれがGingerbread/Honeycombでは可能ではないと思います。ビデオは、キャンバス/ビットマップコンボにレンダリングできない別のサーフェスに表示されます。これはIce Cream SandwichのTextureView APIで可能かもしれませんが、わかりません。 – mportuesisf

+0

が正しいかもしれませんが、まだ私はこれをアーカイブするために近くにr&dをする必要があります。私は画面のrootviewを取得しますが、現在のビューは取得しません。 – milind

答えて

1

簡単ソリューション(しかし、常に動作する保証はありません):あなたが所望の出力を得るために変更することができ、別のSO questionからMediaMetadataRetriever

ソリューション。キャプチャする時間をミリ秒単位で検索し、この時間をMediaMetadataRetrieverに渡してフレームを取得します。

それほど容易なソリューション(常に動作しますが、コーデックがサポートされていて):FFMPEG

1

66CLSjYの答えに展開するには、FFmpegMediaMetadataRetrieverMediaMetadataRetrieverと同じインタフェースを持っていますが、それは、バックエンドとしてFFmpeg使用しています。デフォルトの設定がビデオフォーマットで動作しない場合は、再コンパイルすることでコーデックを有効/無効にすることができます。ここではいくつかのサンプルコードされる。まず

にあなたのビューを変換する方法:

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

を試してみてくださいビットマップ

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

次に、exampのためにSDに保存します。 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!

関連する問題