android 调用 screenrecord 实现录屏

首先要说明的是并未实现,本文讲一下自己的思路。

adb 使用shell 命令 screenrecord 可录屏。

自己写了个app,通过Process p = Runtime.getRuntime().exec(cmd)的方式调用shell命令,报错:

java.lang.SecurityException: Permission Denial: broadcast asks to run as user -2 but is calling from user 0

需要android.permission.INTERACT_ACROSS_USERS_FULL 或者 android.permission.INTERACT_ACROSS_USERS 权限,而这个权限是system app的权限,第三方app是没有权限申请的。

所以说4.4的录屏是需要root权限的。5.0 之后的 MediaProjection API, 不需要 root权限(which allows ordinary, unprivileged applications to record the screen)。

使用 verbose 参数,可见录屏结束后会发送一个广播,用于告诉系统有新文件产生了:

[email protected]:/sdcard $ screenrecord --verbose --time-limit 10 /sdcard/1.mp4
Main display is 720x1280 @59.00fps (orientation=0)
Configuring recorder for 720x1280 video/avc at 4.00Mbps
Content area is 720x1280 at offset x=0 y=0
Time limit reached
Encoder stopping; recorded 6 frames in 10 seconds
Stopping encoder and muxer
Executing: /system/bin/am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_
FILE -d file:///sdcard/1.mp4
Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=fil
e:///sdcard/1.mp4 }
Broadcast completed: result=0

既然如此看一下screenrecord源码吧。

frameworks\av\cmds\screenrecord\screenrecord.cpp
*
* Sends a broadcast to the media scanner to tell it about the new video.
*
* This is optional, but nice to have.
*/
static status_t notifyMediaScanner(const char* fileName)
果然有这样一个函数,然后在 main 函数的末尾调用了此函数:
if (err == NO_ERROR) {
    // Try to notify the media scanner. Not fatal if this fails.
    notifyMediaScanner(fileName);
}

那么,如果注释掉 notifyMediaScanner(fileName); 这一行,重新编译出来的 screenrecord 可执行程序在录屏时就不会发广播了,是不是就不用 root 权限了呢?
经过测试,是可以的。

修改源码,重新编译framework(其实我是编译整个源码,单独编译 framework 并未生成 screenrecord 可执行文件),然后替换掉system/bin/下的 screenrecord(这个操作是需要 root 权限的,所以本文仅仅是为了研究,并不能达到免 root 使用screenrecord 录屏。当然自己做 ROM 的话可以直接把改过的 screenrecord 打包进去),然后确实可以不用root权限执行。但是录屏结果是空文件(大小为0 kb),debug 信息如下:

……

Time limit reached

Encoder stopping; recorded 0 frames in 3 seconds

Stopping encoder and muxer

……

继续查看 screenrecord.cpp ,取消

#define LOG_NDEBUG 0

这一行的注释,即打开 ALOGV 的开关,重新编译,替换手机中的 screenrecord ,app 再次调用 screenrecord 命令,日志如下:

C:\Users\wy>adb logcat | findstr /I "ScreenRecord"
10-17 10:36:17.435 9839 9839 V ScreenRecord: Creating codec
10-17 10:36:17.531 9839 9839 V ScreenRecord: Creating encoder input surface
10-17 10:36:17.533 9839 9839 V ScreenRecord: Starting codec
10-17 10:36:17.618 9839 9839 V ScreenRecord: Codec prepared
10-17 10:36:17.623 9839 9839 V ScreenRecord: Calling dequeueOutputBuffer
10-17 10:36:17.873 9839 9839 V ScreenRecord: dequeueOutputBuffer returned -11
10-17 10:36:17.873 9839 9839 V ScreenRecord: Got -EAGAIN, looping
10-17 10:36:17.873 9839 9839 V ScreenRecord: Calling dequeueOutputBuffer
10-17 10:36:18.124 9839 9839 V ScreenRecord: dequeueOutputBuffer returned -11
10-17 10:36:18.124 9839 9839 V ScreenRecord: Got -EAGAIN, looping
10-17 10:36:18.124 9839 9839 V ScreenRecord: Calling dequeueOutputBuffer

日志显示,在输出 buffer 的时候一直返回错误,不停的重复尝试,直到结束也没成功录屏一帧。

这就不知道什么原因了,还得去看代码。

先丢这里,望明白的大神指点。

时间: 2024-10-23 04:22:36

android 调用 screenrecord 实现录屏的相关文章

Android系统自带录屏(动态截屏)功能

 Android系统(Android 4.4 或以上)自带有录屏(动态截屏)功能,基于命令行. 具体方法是: adb shell screenrecord /sdcard/myrecord.mp4 这段命令在控制台执行后,Android系统将立即对设备的屏幕录制屏幕的视频.adb shell screenrecord 是执行录屏:sdcard/myrecord.mp4 是视频文件存放的目录,录制后的视频文件存放在sdcard的根目录下,myrecord.mp4即是视频文件. Ctrl + C

Android5.0录屏方案

导语 本文主要是围绕android直播助手的功能做了一些研究,因为之前对Android多媒体相关的内容知之甚少,只有概念,于是查阅了相关资料并做以总结. 由于我对音视频相关知识零基础所以补充了一些相关知识 视音频编解码技术零基础学习方法 视音频数据处理入门:RGB.YUV像素数据处理 采集音频原始数据---->压缩编码----> 封装 采集视频原始数据---->压缩编码----> 封装 音视频编码 压缩编码就是对数据进行压缩以节省空间便于存储和传输. 视频压缩编码就是将视频帧的像素

一键生成 Android 录屏 gif 的脚本

目的 编写 bash 脚本, 实现一行命令得到 Android 手机录制屏幕 gif 动图文件. 博主使用 ubuntu 系统, shell 为 bash. 这个脚本也可以用在 mac 系统上. 听说 windows 系统出了 ubuntu on windows, 不知道能不能使用这个脚本. 原理 adb shell screenrecord Android 4.4 版本后系统内预置了一个 screenrecord 命令, 可以用来将屏幕录制为 MP4 格式. 具体命令格式可以通过 –help

Android录屏命令、Android录Gif、Android录视频

NoHttp开源地址:https://github.com/yanzhenjie/NoHttp NoHttp具体使用文档已公布,你想知道的全都有,请点我移步! 版权声明:转载请注明本文转自严振杰的博客: http://blog.yanzhenjie.com 演示 大家看博客时常常看到以下这样的图片,都非常想知道怎么做的吧,好在自己写博客时也把操作录下来: 这个图是我还有一个博客的图讲Android三级联动和ListView单选多选的,博客和源代码传送门,如今呢就一步步教大家怎么来做这个图. 上方

Android录屏应用开发研究

1截屏接口 在Android5.0之前如果希望截图屏幕,是需要获取系统root权限的.但在Android5.0之后Android开放了新的接口android.media.projection,开发者使用该接口,第三方应用程序无需再获取系统root权限也可以直接进行屏幕截图操作了.查询其官方api可知,该接口主要用来"屏幕截图"操作和"音频录制"操作,这里只讨论用于屏幕截图的功能.由于使用了媒体的映射技术手段,故截取的屏幕并不是真正的设备屏幕,而是截取的通过映射出来的

Android tips(九)-->Android录屏与转化gif图

转载请标明出处:一片枫叶的专栏 最近有同学问我android手机的录屏以及转化成gif图是如何实现的?今天正好就讲讲android的录屏与转化gif操作.整个Android系统的录制与转化GIF图是分为两个部分,录制过程与转化过程,下面就详细的介绍一下这两个部分的具体过程. android手机的录屏操作 android手机也有一些录制屏幕的软件,但是作为程序员还是推荐使用adb 命令实现对屏幕操作的录制操作的,而下面我们就介绍一下实现屏幕录制功能的adb命令:screenrecord. 关于sc

Android实现录屏直播(一)ScreenRecorder的简单分析

应项目需求瞄准了Bilibili的录屏直播功能,基本就仿着做一个吧.研究后发现Bilibili是使用的MediaProjection 与 VirtualDisplay结合实现的,需要 Android 5.0 Lollipop API 21以上的系统才能使用. 其实官方提供的android-ScreenCapture这个Sample中已经有了MediaRecorder的实现与使用方式,还有使用MediaRecorder实现的录制屏幕到本地文件的Demo,从中我们都能了解这些API的使用. 而如果需

Android免Root录屏

首先确保你的Android系统版本是5.0+ 1.安装一个叫"游视秀"的手机应用,你可以直接扫描下方的二维码下载安装 2.打开“游视秀” 3.点击右上角“录屏”的图标 4.选择一个录屏方式,手机推荐“竖屏录制”平板推荐“横屏录制” 5.选择好录屏方式后会出现桌面会出现悬浮框,点击可以开始录屏,再次点击可以结束录屏 6.啊咧,怎么桌面TM的没有悬浮框啊!!!别着急,在“其他应用管理”->“游视秀”->“权限管理”->“显示悬浮窗”->“允许”,然后再次打开“游视秀

Android录屏流程

1.权限申明 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 2.请求录屏 private MediaProjectionManager mMediaProjectionManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBi