Как сделать снимок экрана в текущем видео?

Я пытаюсь сделать снимок экрана с воспроизводимого в данный момент видео. Я пытаюсь с кодом, который успешно выполняет скриншот веб-представления, но не добивается успеха в том, чтобы снимать видео в настоящее время.

Код, как показано ниже для веб-представления.

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

Упрощенное решение (но не гарантируется всегда работать): MediaMetadataRetriever

Решение другого вопроса SO > , которое вы можете изменить, чтобы получить желаемый результат. Найдите время в миллисекундах, которое вы хотите захватить и передать на этот раз MediaMetadataRetriever, чтобы получить кадр.

Не так простое решение (всегда будет работать, если поддерживается кодек): FFMPEG

Ответ 2

Чтобы расширить ответ на 66CLSjY, FFmpegMediaMetadataRetriever имеет тот же интерфейс, что и MediaMetadataRetriever, но он использует 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;
}

Удачи!