2011-11-15 70 views
11

Tôi đang cố chụp ảnh màn hình của video hiện đang phát. Tôi đang thử với mã mà thành công có một ảnh chụp màn hình của xem web nhưng không thành công trong việc chụp ảnh của video hiện đang chơi.cách chụp màn hình của video hiện đang phát?

Mã như sau cho chế độ xem 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

Thật không may, tôi không nghĩ điều này có thể xảy ra trong Gingerbread/Honeycomb. Video được hiển thị trong một Bề mặt riêng biệt không thể hiển thị thành kết hợp Canvas/Bitmap. Điều này có thể là có thể với các API TextureView trong Ice Cream Sandwich, mặc dù tôi không chắc chắn. – mportuesisf

+0

có thể là u là đúng nhưng tôi vẫn cần phải làm r & d cho i m gần để lưu trữ này, tôi nhận được rootview của màn hình nhưng không có được xem hiện tại. – milind

Trả lời

1

Giải pháp dễ dàng hơn (Nhưng không được bảo đảm để làm việc luôn): MediaMetadataRetriever

Giải pháp từ một SO question mà bạn có thể sửa đổi để có được những kết quả mong muốn. Tìm thời gian bằng mili giây mà bạn muốn chụp và chuyển thời gian này tới MediaMetadataRetriever để lấy khung.

Không phải như vậy giải pháp dễ dàng hơn (Luôn sẽ làm việc, cung cấp các codec được hỗ trợ): FFMPEG

1

Để mở rộng về câu trả lời của 66CLSjY, FFmpegMediaMetadataRetriever có giao diện tương tự như MediaMetadataRetriever nhưng nó sử dụng FFmpeg như là phụ trợ. Nếu cấu hình mặc định không hoạt động với định dạng video của bạn, bạn có thể bật/tắt codec bằng cách biên dịch lại. Dưới đây là một số mẫu mã:

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

thử này nó sẽ cung cấp cho bitmap cho màn hình ứng dụng của bạn

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

này làm việc cho tôi:

Lần đầu tiên một phương pháp để chuyển đổi cái nhìn của bạn thành một 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; 
} 

Sau đó lưu vào SD, để thoát 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; 
} 

Chúc may mắn!

Các vấn đề liên quan