如何截取当前播放视频的屏幕截图?

12
我想要截取当前播放视频的屏幕截图。我已经编写了成功截取网页视图的代码,但是在尝试截取正在播放视频的照片时未能成功。
以下是用于网页视图的代码。
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中这是不可能的。视频会显示在一个无法渲染到Canvas/Bitmap组合中的单独Surface上。虽然在Ice Cream Sandwich中使用TextureView API可能是可行的,但我不确定。 - mportuesisf
也许你是对的,但我仍然需要进行研究和开发,因为我接近实现这个目标。我已经获取了屏幕的根视图,但无法获取当前视图。 - milind
3个回答

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

然后保存到SD卡中,例如:

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

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接