VideoView getDrawingCache возвращается черный - PullRequest
11 голосов
/ 12 марта 2011

Итак, я пытаюсь сделать снимок экрана с VideoView. Я подумал, что самый простой способ будет:

videoView.setDrawingCacheEnabled(true);

Тогда, когда мне нужно сделать скриншот:

Bitmap screenshot = videoView.getDrawingCache();

Но по какой-то причине растровое изображение, которое я получаю, каждый раз просто черное. Кто-нибудь имел успех с этим? Я также попробовал:

Bitmap bitmap = Bitmap.createBitmap(videoView.getWidth(), videoView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
videoView.draw(canvas);

Но еще раз, это возвращает мне черное изображение. Я вижу, что VideoView едва ли задокументирован в javadocs для Android. Любая помощь?

Ответы [ 2 ]

13 голосов
/ 12 марта 2011

Из документов для Просмотр # setDrawingCacheEnabled :

Включение кеша рисования аналогично установить слой, когда оборудование ускорение отключено. когда аппаратное ускорение включено, включение кеша рисования не имеет влияние на рендеринг, потому что система использует другой механизм для ускорение, которое игнорирует флаг. Если вы хотите использовать растровое изображение для просматривать даже при аппаратном ускорении включен, см. setLayerType (int, android.graphics.Paint) для информация о том, как включить программное обеспечение и аппаратные слои.

Возможно, что VideoView работает с аппаратным ускорением и обходит механизм кэширования. Хорошее исходное погружение может пролить свет.

Редактировать - Этот пост , кажется, проясняет некоторые вещи:

Извините, по своей природе SurfaceView делает не рисовать в иерархии нормального представления обновите систему, чтобы она не отображалась что.

(VideoView - дочерний элемент SurfaceView)

0 голосов
/ 28 октября 2012

Начиная с API 10, вы можете использовать MediaMetadataRetriever для извлечения кадра в данный момент времени (в микросекундах ).Вот пример кода:

public Bitmap videoFrame(String uri, long msec) {       
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    try {                       
        retriever.setDataSource(uri);            
        return retriever.getFrameAtTime(msec);
    } catch (IllegalArgumentException ex) {
        ex.printStackTrace();
    } catch (RuntimeException ex) {
        ex.printStackTrace();
    } finally {
        try {
            retriever.release();
        } catch (RuntimeException ex) {
        }
    }
    return null;
}
...