videoview 截图黑屏
公司要做一个监控显示网页,在监控机器上用videoview显示监控画面,需要在网页显示videoview的实时画面。就想到直接截取整个videoview区域,直接传图片给网页。发现videoview使用getDrawingCahe截图容易黑屏,但是其中的滚动字幕是可以正常截取显示的。
查了很多资料,有的说是截取的大小不同,有的说是videoview的版本不对,问题各种各样。
自己尝试了很久,在主管帮助下使用下面的方法。
private Bitmap toConformBitmap(Bitmap background, Bitmap foreground)
{//拼接图片,video截图+滚动字幕截图
Canvas cv = new Canvas(background);
cv.drawBitmap(foreground, 0, background.getHeight()-foreground.getHeight(), null);
cv.save(Canvas.ALL_SAVE_FLAG);//保存
cv.restore();//存储
return background;
}
public InputStream GetBitmapData()
{ //获取屏幕截图
Bitmap bm = mVideoView.getBitmap();
if(bm == null)
{
Log.e(TAG,"bitmap is null");
return null;
}
bm = Bitmap.createScaledBitmap(bm, bm.getWidth()/3, bm.getHeight()/3, true);
if(mScollView.getVisibility() == View.VISIBLE)
{
Bitmap bmText = mScollView.getDrawingCache();
if( bmText != null )//若videoview存在滚动字幕,则截取滚动字幕截图
{
bmText = Bitmap.createScaledBitmap(bmText, bmText.getWidth()/3, bmText.getHeight()/3, true);
bm = toConformBitmap(bm,bmText);//拼接
}
else
{
Log.e(TAG,"mScollView bitmap is null");
}
}
ByteArrayOutputStream fout = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 90, fout);//图片转为.jpg
ByteArrayInputStream fin = new ByteArrayInputStream(fout.toByteArray());
return fin;
}
public InputStream GetBitmapDataAsync() throws InterruptedException
{//将图片变为数据流能够传给网页
final ArrayBlockingQueue<InputStream> InputQueue = new ArrayBlockingQueue<InputStream>(1);
runOnUiThread(new Runnable()
{
@Override
public void run()
{
InputQueue.add(GetBitmapData());
}
});
return InputQueue.take();
}
......
GetBitmapDataAsync();//获取屏幕截图Bitmap流
......
注意:videoview播放视频时可以正常截图,但是播放监控时容易黑屏。因为播放视频时,后台会同时播放,获取的截图都是固定的;但是监控不能预知下一秒会出现什么,所以会黑屏。具体的技术原因我这个小白不清楚。