Frage Wie nimmst du Screenshots von Videos, die gerade abgespielt werden?


Ich versuche, einen Screenshot des aktuell wiedergegebenen Videos zu erstellen. Ich versuche mit Code, der erfolgreich einen Screenshot der Webansicht erstellt, aber keinen Erfolg bei der Aufnahme des gerade wiedergegebenen Videos macht.

Der Code folgt für die Webansicht.

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

11
2017-11-15 17:36


Ursprung


Antworten:


Einfachere Lösung (aber nicht garantiert, immer zu arbeiten): MediaMetadataRetriever

Lösung von einem anderen SO Frage die Sie ändern können, um die gewünschte Ausgabe zu erhalten. Suchen Sie die Zeit in Millisekunden, die Sie erfassen möchten, und übergeben Sie diese Zeit an MediaMetadataRetriever, um den Frame abzurufen.

Nicht so einfach Lösung (Immer funktioniert, vorausgesetzt der Codec wird unterstützt): FFMPEG


1
2018-06-17 10:34



Um die Antwort von 66CLSjY zu erweitern, FFmpegMediaMetadataRetriever hat die gleiche Schnittstelle wie MediaMetadataRetriever aber es benutzt FFmpeg als Backend. Wenn die Standardkonfiguration nicht mit Ihrem Videoformat funktioniert, können Sie Codecs durch Neukompilieren aktivieren / deaktivieren. Hier ist ein Beispielcode:

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

1
2018-06-18 14:28



versuchen Sie es, es gibt Bitmap für Ihren App-Bildschirm

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

0
2018-06-19 04:32



Das funktioniert für mich:

Zuerst eine Methode, um Ihre Ansicht in eine Bitmap zu konvertieren

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

Dann speichern Sie in der SD, zum Beispiel:

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

Viel Glück!


0
2018-06-19 07:12