【问题标题】:how take screen shot of currently playing video?如何截取当前播放的视频?
【发布时间】:2011-11-15 17:36:23
【问题描述】:

我正在尝试截取当前正在播放的视频。我正在尝试使用成功截取网络视图的代码,但无法成功拍摄当前正在播放的视频的照片。

网页视图的代码如下。

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");

【问题讨论】:

  • 不幸的是,我认为这在 Gingerbread/Honeycomb 中是不可能的。视频显示在无法呈现为画布/位图组合的单独 Surface 中。 Ice Cream Sandwich 中的 TextureView API 可能会实现这一点,但我不确定。
  • 也许你是对的,但我仍然需要做研发,因为我已经接近存档了,我得到了屏幕的 rootview 但没有得到当前视图。

标签: android video


【解决方案1】:

更简单的解决方案(但不保证始终有效):MediaMetadataRetriever

来自另一个 SO question 的解决方案,您可以对其进行修改以获得所需的输出。找到您要捕获的时间(以毫秒为单位)并将此时间传递给 MediaMetadataRetriever 以获取帧。

不太简单的解决方案(只要支持编解码器,总是可以工作):FFMPEG

【讨论】:

    【解决方案2】:

    为了扩展 66CLSjY 的答案,FFmpegMediaMetadataRetrieverMediaMetadataRetriever 具有相同的接口,但它使用FFmpeg 作为后端。如果默认配置不适用于您的视频格式,您可以通过重新编译来启用/禁用编解码器。下面是一些示例代码:

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

    【讨论】:

      【解决方案3】:

      试试这个,它会为您的应用屏幕提供位图

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

      【讨论】:

        【解决方案4】:

        这对我有用:

        首先一种将视图转换为位图的方法

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

        祝你好运!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-11
          • 1970-01-01
          • 2019-11-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多