Как сделать снимок экрана в текущем видео?
Я пытаюсь сделать снимок экрана с воспроизводимого в данный момент видео. Я пытаюсь с кодом, который успешно выполняет скриншот веб-представления, но не добивается успеха в том, чтобы снимать видео в настоящее время.
Код, как показано ниже для веб-представления.
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;
}
Удачи!