Android在Kitkat和Lollipop上获得了一个新的API,用于视频捕捉屏幕。您可以通过ADB工具或代码(从Lollipop开始)来完成。
自从新的API发布以来,许多应用程序都使用了这一功能,允许录制屏幕,微软甚至还开发了自己的Google Now On tap竞争对手应用程序。
使用ADB,您可以使用:
adb shell screenrecord /sdcard/video.mp4
你甚至可以在Android Studio内部完成这项工作。
我找不到任何关于如何使用API的教程或解释,这意味着在代码中。
我找到的唯一地方就是文档(这里,在“屏幕捕获和共享”下),告诉我:
Android 5.0允许您使用新的Android向应用程序添加屏幕捕获和屏幕共享功能。媒体投影API。例如,如果要在视频会议应用程序中启用屏幕共享,此功能非常有用。
新的createVirtualDisplay()
方法允许应用将主屏幕(默认显示)的内容捕获到Surface对象中,然后应用可以通过网络发送该对象。该API仅允许捕获非安全屏幕内容,而不允许捕获系统音频。要开始屏幕捕获,您的应用程序必须首先通过使用通过createScreenCaptureIntent()
方法获得的Intent启动屏幕捕获对话框来请求用户的权限。
有关如何使用新API的示例,请参见示例项目中的MediaProjectOnDemo类。
问题是,我找不到任何“MediaProjectionDemo”样本。相反,我找到了“屏幕捕获”示例,但我不明白它是如何工作的,因为当我运行它时,我看到的只是一个闪烁的屏幕,我认为它不会将视频保存到文件中。这个样品看起来很有问题。
如何使用新API执行这些操作:
此外,我如何自定义它(分辨率,要求的fps,颜色,时间...)?
第一步,也是肯·怀特正确建议的那一步
我以前使用过他们的API。我同意截图很直接。但是,屏幕录制也在类似的线路下。
我将分三个部分回答您的问题,并以一个链接作为结尾。:)
1.开始录像
private void startScreenRecord(final Intent intent) {
if (DEBUG) Log.v(TAG, "startScreenRecord:sMuxer=" + sMuxer);
synchronized(sSync) {
if (sMuxer == null) {
final int resultCode = intent.getIntExtra(EXTRA_RESULT_CODE, 0);
// get MediaProjection
final MediaProjection projection = mMediaProjectionManager.getMediaProjection(resultCode, intent);
if (projection != null) {
final DisplayMetrics metrics = getResources().getDisplayMetrics();
final int density = metrics.densityDpi;
if (DEBUG) Log.v(TAG, "startRecording:");
try {
sMuxer = new MediaMuxerWrapper(".mp4"); // if you record audio only, ".m4a" is also OK.
if (true) {
// for screen capturing
new MediaScreenEncoder(sMuxer, mMediaEncoderListener,
projection, metrics.widthPixels, metrics.heightPixels, density);
}
if (true) {
// for audio capturing
new MediaAudioEncoder(sMuxer, mMediaEncoderListener);
}
sMuxer.prepare();
sMuxer.startRecording();
} catch (final IOException e) {
Log.e(TAG, "startScreenRecord:", e);
}
}
}
}
}
2.停止录像
private void stopScreenRecord() {
if (DEBUG) Log.v(TAG, "stopScreenRecord:sMuxer=" + sMuxer);
synchronized(sSync) {
if (sMuxer != null) {
sMuxer.stopRecording();
sMuxer = null;
// you should not wait here
}
}
}
2.5. 暂停并恢复视频录制
private void pauseScreenRecord() {
synchronized(sSync) {
if (sMuxer != null) {
sMuxer.pauseRecording();
}
}
}
private void resumeScreenRecord() {
synchronized(sSync) {
if (sMuxer != null) {
sMuxer.resumeRecording();
}
}
}
希望代码有帮助。这是我提到的代码的原始链接,也是这个实现(视频录制)的来源。
3.拍摄屏幕截图而不是视频
我认为默认情况下,以位图格式捕获图像很容易。您仍然可以继续使用MediaProjectionDemo示例来捕获屏幕截图。
[编辑]:屏幕截图的代码加密
a、 根据设备宽度/高度创建虚拟显示
mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 2);
mVirtualDisplay = sMediaProjection.createVirtualDisplay(SCREENCAP_NAME, mWidth, mHeight, mDensity, VIRTUAL_DISPLAY_FLAGS, mImageReader.getSurface(), null, mHandler);
mImageReader.setOnImageAvailableListener(new ImageAvailableListener(), mHandler);
b、 然后根据意图或动作启动屏幕捕获-
startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
停止媒体放映-
sMediaProjection.stop();
C.然后转换成图像-
//Process the media capture
image = mImageReader.acquireLatestImage();
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * mWidth;
//Create bitmap
bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
//Write Bitmap to file in some path on the phone
fos = new FileOutputStream(STORE_DIRECTORY + "/myscreen_" + IMAGES_PRODUCED + ".png");
bitmap.compress(CompressFormat.PNG, 100, fos);
fos.close();
有几种媒体投影API的实现(完整代码)。其他一些可以帮助你发展的链接-
>
使用MediaProjectionManager录制视频-网站
android截屏-github
根据android开发者的观察:)
屏幕记录器-github
使用MediaProjectionAPI捕获并录制Android屏幕-网站
希望有帮助:)快乐的编码和屏幕录制!
PS:你能告诉我你所说的微软应用程序吗?我没有用过。想试试吗:)
我需要使用Sikuli的自动化,但我无法采取截图。问题是,当我点击“截屏”或“创建区域”时,IDE会被隐藏,但选择区域选项不会出现....
我想让应用程序像“简易屏幕录制器”。我必须从哪里开始,因为我搜索了很多,但没有找到任何开始的链接。有任何用于创建屏幕录制器的api,而不是屏幕截图。我不想使用javacv从屏幕截图创建视频。我只想让用户启动应用程序,点击开始录制按钮,然后用户在手机上所做的一切来录制这些内容。 1) Android系统中是否有相关的api。 2) 如何在android中创建屏幕录制器应用程序。 3)是没有任何api
我试图根据用户输入的坐标捕捉区域截图。基本上,用户在屏幕上点击得到x,y坐标,然后在其他地方点击另一对x,y坐标,然后将其放入一个矩形中,并使用机器人库创建屏幕截图。 我有的问题是,我得到了随机截图,这不是用户输入的坐标,我怎么能考虑包括0的坐标,因为矩形值必须超过1。 以下是我迄今为止的代码:
在Linux下有很多屏幕载图的工具,下面简单介绍一下: 在GNOME桌面中自带了一个屏幕截图工具,位于“动作”栏内。该工具功能很少,只能截取当前屏幕。 在GMIP中也可截图,在“文件”--“获取”菜单下有一个“屏幕抓图”选项可进行屏幕截图。它可截取任意图窗口的内容,并自动输入到GMIP中,我们可方便地进行处理和保存。 安装ImageMagick软件,它有一个工具叫import可用于屏幕截图。该工具
点击按钮进行截屏,可以将截屏图像保存到相册中。 作者说:听说会和苹果的策略有冲突,应用如果上架可能会被拒绝。这个估计是看人品了吧。经过测试发现,如果先弹出对话框,然后再截屏,似乎并不能把对话框也给保存下来。 [Code4App.com]
我是新来的颤振,有谁能帮助我知道如何实现屏幕设计,如使用颤振截图所示。