精华内容
下载资源
问答
  • Android 录屏截屏

    2017-11-16 16:48:50
    Android 5.0 录屏截屏Android 5.0 录屏截屏Android 5.0 录屏截屏
  • Android录屏截屏功能

    2018-04-27 16:40:26
    Android5.0以上使用MediaProjection实现录屏截屏功能
  • Android 5.0 录屏截屏

    2017-11-16 16:47:28
    Android 5.0 录屏截屏Android 5.0 录屏截屏Android 5.0 录屏截屏Android 5.0 录屏截屏Android 5.0 录屏截屏Android 5.0 录屏截屏
  • jerry-wang-1154193-unsplash.jpg录屏转动图最近看见一个视频转GIF的开源项目:ffmpeg-commands-executor-library,...效果也不怎么好,就想借这个东西来做一个录屏转GIF合一的APPAndroid录屏Android 5.0+ 可以利...

    81cb36b610f4

    jerry-wang-1154193-unsplash.jpg

    录屏转动图

    最近看见一个视频转GIF的开源项目:ffmpeg-commands-executor-library,有时会有手机录屏转成GIF动图的需求,都是下载一个录屏软件录屏,再下一个转换软件,一般是电脑上的软件或者在线转换,效果也不怎么好,就想借这个东西来做一个录屏转GIF合一的APP

    Android录屏

    Android 5.0+ 可以利用MediaProject 在非 root 情况下实现屏幕录制,具体过程就是开启录屏服务,设置SurfaceView去接收内容,获取视频流,然后通过MediaCodec来实现视频的硬编码,然后保存为视频文件

    Android 5.0+ 屏幕录制:介绍了如何进行屏幕录制还有具体的demo

    Android截屏、录屏工具:可以快速依赖,集成录屏功能

    FFmpeg的使用

    1.FFmpeg视频转GIF命令,我感觉应该这应该是是最全的命令了,时间单位为s,会根据宽度值自适应高度

    String command = "ffmpeg -i " + pathFrom + " -ss " + 跳过开头时间 + " -t " + 转换的时间 + " -vf scale=" + gif宽度 + ":-1 -r " + gif帧率 + " " + pathTo;

    //ffmpeg-commands-executor-library中的方法

    2.使用ffmpeg-commands-executor-library中的方法来执行命令

    FFmpegNativeHelper.runCommand(command);

    这样的确可以转化成功,但是有一个bug,就是每次打开APP只能转换一次,第二次会失败,看得出来作者已经没有维护了,这样其实也没什么问题,每次转换重新打开APP就好了,非常简单,而且还有其他ffmpeg的功能也可以用。

    编译FFmpeg库

    ffmpeg这么强大的一个开源库,现在程序有这么大一个bug存在,那肯定是不能忍受的,可以自己去下载ffmpeg源码然后编译出在Android上面可以运行的库。涉及到JNI和NDk,但其实一点都不难,我之前也没有接触过,不过看了几篇教程踩了不少坑也成功了。

    在Android中集成FFmpeg:我编译的库,可以快速依赖,集成FFmpeg,也有源码

    网上文章很多,但是真的有各种问题,我试了不少,下面两篇文章完全照着做其实也是不行的,但是改改还是可以搞定。

    注意问题

    文章里面教的复制的ffmpeg的源码有点小问题,找不到的就先不要管;

    在Android里面报错找不到c++的类,我们要根据找不到的类的名字去FFmpeg里面去找,然后添加进去;

    然后c++中有些明明同一个包下的类找不到,因为在同一个文件夹下面的类其实不用导入,原c++文件导入时候添加了当前包名导致路径出错,可以直接删除导入的代码(就是import*什么的删除掉就好了)

    其实到了文章最后,也讲了之前那个二次调用失败的问题,并且给出了解决方案:

    FFmpeg每次执行完命令后会调用 ffmpeg_cleanup 函数清理内存,并且会调用exit(0)结束当前进程,但是经过我们的修改,exit()的代码已经被删掉,而我们的App还在运行,不能杀死进程,所以有些变量的值还在内存中,这样就会导致下次执行的时候可能会出错。

    打开ffmpeg.c找到刚修改的run函数,然后在 return 前加上如下代码即可:

    nb_filtergraphs = 0;

    progress_avio = NULL;

    input_streams = NULL;

    nb_input_streams = 0;

    input_files = NULL;

    nb_input_files = 0;

    output_streams = NULL;

    nb_output_streams = 0;

    output_files = NULL;

    nb_output_files = 0;

    完美方案

    但是这个方法只解决了函数清理的问题,这样去运行命名,还是有问题程序完成后直接退出了,原因很简单,其实就是c++完成后调用了下面这个函数,是结束当前进程,这个东西还是没有改好

    int exit_program(int ret)

    {

    if (program_exit)

    program_exit(ret);

    return ret;

    }

    只需要改成这样就好了:

    int exit_program(int ret)

    {

    return ret;

    }

    支持录屏后转gif,支持摄像后转gif,支持本地视频转gif以及各种参数设置(侧边栏菜单中设置)

    展开全文
  • Android iOS防录屏截屏

    2021-08-10 10:00:08
    目录Android录屏截屏关于WindowManager.LayoutParams.FLAG_SECURE关于Display.FLAG_SECUREiOS防录屏截屏监听截屏录屏监听 需求与安全总是对立的,有新的需求,就有新的接口开放,但随之而来的就是利用新接口...


    需求与安全总是对立的,有新的需求,就有新的接口开放,但随之而来的就是利用新接口或者新接口的使用者(app使用者)不按预期出牌。
    简单说,我们打出了一把刀,有人用来切菜,有人用来砍柴,有人却用来行凶… 大概是这个意思,互联网软件行业特别多,尤其是破解、攻击。
    言归正传,今天来探讨一下android和ios的防录屏。录屏接口的开放,ios和android开放都比较迟,早期系统都是没有的功能,但随着用户的需求,陆续都开放了录屏的接口。随之而来的就是应用安全-防录屏。典型的应用是金融、银行类的APP。

    Android防录屏和截屏

    Android比较容易,只需要在 Activity 的onCreate() 方法中添加一行代码:

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
    

    一般情况下哪些activity不希望被截屏,添加上述代码,当然,多的话肯定是做一个BaseActivity,BaseActivity中加这行代码就可以。当这样的activity在前台时,用户启动截屏或录屏,系统会提示安全而不能截屏或录屏。从源头就断掉了录屏和截屏。

    关于WindowManager.LayoutParams.FLAG_SECURE

    /** Window flag: treat the content of the window as secure, preventing
    * it from appearing in screenshots or from being viewed on non-secure
    * displays.
    *
    *

    See {@link android.view.Display#FLAG_SECURE} for more details about
    * secure surfaces and secure displays.
    */
    public static final int FLAG_SECURE = 0x00002000;

    关于Display.FLAG_SECURE

    **
    * Display flag: Indicates that the display has a secure video output and
    * supports compositing secure surfaces.
    *


    * If this flag is set then the display device has a secure video output
    * and is capable of showing secure surfaces. It may also be capable of
    * showing {@link #FLAG_SUPPORTS_PROTECTED_BUFFERS protected buffers}.
    *


    * If this flag is not set then the display device may not have a secure video
    * output; the user may see a blank region on the screen instead of
    * the contents of secure surfaces or protected buffers.
    *


    * Secure surfaces are used to prevent content rendered into those surfaces
    * by applications from appearing in screenshots or from being viewed
    * on non-secure displays. Protected buffers are used by secure video decoders
    * for a similar purpose.
    *


    * An application creates a window with a secure surface by specifying the
    * {@link WindowManager.LayoutParams#FLAG_SECURE} window flag.
    * Likewise, an application creates a {@link SurfaceView} with a secure surface
    * by calling {@link SurfaceView#setSecure} before attaching the secure view to
    * its containing window.
    *


    * An application can use the absence of this flag as a hint that it should not create
    * secure surfaces or protected buffers on this display because the content may
    * not be visible. For example, if the flag is not set then the application may
    * choose not to show content on this display, show an informative error message,
    * select an alternate content stream or adopt a different strategy for decoding
    * content that does not rely on secure surfaces or protected buffers.
    *


    *
    * @see #getFlags
    */
    public static final int FLAG_SECURE = 1 << 1;

    iOS防录屏和截屏

    ios 主要是以监听状态。

    监听截屏

    UIApplication中仅有用户截屏后的通知,应用中只会收到已经截屏的通知并没办法干预(iOS8之后失效)。

    // This notification is posted after the user takes a screenshot (for example by pressing both the home and lock screen buttons)
    UIKIT_EXTERN NSNotificationName const UIApplicationUserDidTakeScreenshotNotification NS_AVAILABLE_IOS(7_0);
    

    监听到之后进行处理:

    -(void)viewDidAppear:(BOOL)animated{
        [super viewDidAppear:animated];
        
        [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(screenshots) name:UIApplicationUserDidTakeScreenshotNotification  object:nil];
    }
    
    -(void)screenshots
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"[安全提醒]内含个人资金账户。不要截图,录制或分享给他人以保障资金账户安全。" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
        [alert show];
    
    -(void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationUserDidTakeScreenshotNotification object:nil];
    }
    

    录屏监听

    iOS 11 SDK 中新增了UIScreen的API用以告知应用当前屏幕正在录屏。当UIScreen.isCaptured 为true时,表示当前屏幕正在被录制、镜像或被Airplay 发送。

    当录屏状态发生变化时,UIKit会发送UIScreenCapturedDidChange的notification。
    基于此,我们可以在应用中接收此通知,来对用户的录屏行为做相应的处理

    -(void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
    
        //检查当前设备是否处于录屏状态,这里应该是需要定时器来获取,否则只有加载的时候才会判断
        UIScreen * sc = [UIScreen mainScreen];
        if (@available(iOS 11.0, *)) {
            if (sc.isCaptured) {
                NSLog(@"录屏中");
                [self screenshots];
            }
        } else {
            
        }
        if (@available(iOS 11.0, *)) {
    //注册通知,监测当前设备录屏状态发生变化
            [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(screenshots) name:UIScreenCapturedDidChangeNotification  object:nil];
        } else {
        }
    }
    
    -(void) screenshots
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"正在录屏,请注意帐号密码安全问题" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
        [alert show];
    }
    
    -(void)dealloc
    {
        if (@available(iOS 11.0, *)) {
            [[NSNotificationCenter defaultCenter] removeObserver:self name:UIScreenCapturedDidChangeNotification object:nil];
        } else {
            
        }
    }
    

    部分引用
    https://www.jianshu.com/p/a94969ddd1dc

    展开全文
  • Android 录屏\截图

    2015-09-22 16:40:51
    Android从4.4开始支持录屏了!   必备条件:platform tools(即adb)升级到V19。  一台android 4.4系统的设备。   一、通过下面的步骤,即可通过adb命令实现录屏 1. adb shell 2. screenrecord [options...

    Android从4.4开始支持录屏了!

     

    必备条件:platform tools(即adb)升级到V19。

             一台android 4.4系统的设备。

     

    一、通过下面的步骤,即可通过adb命令实现录屏

    1.      adb shell

    2.      screenrecord [options][filename]

    Options:

    --sizeWIDTHxHEIGHT

             设置视频的尺寸,例如“1280x720”。默认是设备的主屏幕分辨率大小(如果支持),如果不支持,默认使用“1280x720”。如果对视频分辨率没要求,这个参数可不写。

    --bit-rateRATE

        设置视频的比特率。参数范围为[100000,100000000],默认是4Mbps,即4000000。

    --time-limitTIME

        设置视频最长录制时间,以秒为单位。默认最长为180秒。

    --rotate

        视频旋转90度。

    --verbose

        在标准输出中显示更多详细信息。

    --help

        显示帮助信息。

    filename 必写项。视频保存的位置。

     

    eg.  adb shell screenrecord --bit-rate 100000000/sdcard/test.mp4

    在录屏过程中可以通过Ctrl-C命令退出。

     

    PS:如果需要记录在屏幕上点击的位置信息,建议在”开发者选项”里勾选”显示触摸位置”。

        如果无法用该设备打开录制的视屏,建议下载其他第三方视屏播放软件。

    ++++++++++++screencap++++++++++
    帮助命令
    bixiaopeng@bixiaopeng ~$ adb shell screencap -v
    screencap: invalid option -- v
    usage: screencap [-hp] [-d display-id] [FILENAME]
       -h: this message
       -p: save the file as a png.
       -d: specify the display id to capture, default 0.
    If FILENAME ends with .png it will be saved as a png.
    If FILENAME is not given, the results will be printed to stdout.
    
    

    注意:

    如果文件名以.png结尾时,它将保存为png文件

    如果文件名没有给出,则结果被会被输出到stdout

    截图保存到SD卡里再导出

    $ adb shell screencap -p /sdcard/screen.png
    $ adb pull /sdcard/screen.png
    $ adb shell rm /sdcard/screen.png
    

    这种方法比较麻烦,需要3步:1. 截图保存到sdcard 2.将图片导出 3.删除sdcard中的图片

    截图直接保存到电脑

    $ adb shell screencap -p | sed 's/\r$//' > screen.png
    

    执行adb shell 将\n转换\r\n, 因此需要用sed删除多余的\r

    如果直接当命令用还可以用 alias 包裝装起來:

    $ alias and-screencap="adb shell screencap -p | sed 's/\r$//'"
    $ and-screencap > screen.png 
    

    以后就可以方便的用and-screencap > 直接将截图保存到电脑上了

    +++++++++++ screenshot +++++++++++
    1|root@ebc_gf06:/ # screenshot                                                 
    usage: screenshot [-s soundfile] filename.png
       -s: play a sound effect to signal success
       -i: autoincrement to avoid overwriting filename.png
    展开全文
  • 首先我的应用场景Mediacodec ,使用了摄像头流与录屏流,中间会进行切换,然后录出来一个完整的视频,也就是从摄像到录屏再到摄像再录屏,需求比较。。。因为要录像又要录屏,所以不可能直接用手机屏幕的实际分辨率...

          1.问题:

          首先我的应用场景Mediacodec ,使用了摄像头流与录屏流,中间会进行切换,然后录出来一个完整的视频,也就是从摄像到录屏再到摄像再录屏,需求比较。。。因为要录像又要录屏,所以不可能直接用手机屏幕的实际分辨率。所以从camera.getParameters()获取宽高并设置为输出的视频的分辨率。现象是很多手机上看录制好的视频录屏那块被缩小了,其实是因为有黑边造成的。因此问题其实是基于录屏的输出视频分辨率为核心的,其他录屏方案也大多适用。

         2.分析

         大多数手机获取的camera的分辨率与屏幕的分辨率不一致,重要的是长宽比不一样,比如说。相机获取了1920*1080的分辨率,而你的手机是2340*1080的分辨率,在录屏的时候输出视频,第一录屏要全屏录,也就是宽是2340,第二视频不会裁剪,所以你最后要输出1920*1080,他的宽自然要缩小,高度也就跟着等比缩小,然后上下会有黑边填充。也就是其实视频最后输出的是1920*1080,之所以看起来小了是上下填充了黑边。

           所以你要做的就是一个断点一个断点的去看相机支持的分辨率,然后一个一个去算比例,然后发现一些规律,然后换一部手机,然后再执行这一套操作,然后再换一步手机。。。

          好在这些我都替你做了。

         3.处理     

          查找camera支持的分辨率中最接近手机实际屏幕比例的值

    其实是从手机支持的视频分辨率中找,不过因为也要用摄像头,视频支持的包括摄像头支持且比摄像头支持的多,所以要从摄像头支持的里找。即List<Camera.Size> prviewSizeList = myParameters.getSupportedPreviewSizes();不开摄像头的可以试着从List<Camera.Size> videoSizeList = myParameters.getSupportedVideoSizes();里找。下面是核心代码

    public void initCamera() {
        getScreenSize();
        //注:摄像头相关的设置不写了,省的看混
        ............
        Camera.Parameters myParameters = myCamera.getParameters();
        //获取摄像头支持的分辨率
        List<Camera.Size> prviewSizeList = myParameters.getSupportedPreviewSizes();
        //获取手机支持的视频分辨率
        //List<Camera.Size> videoSizeList = myParameters.getSupportedVideoSizes();
        //获取最接近的分辨的索引
        int selectIndex = bestVideoSize(prviewSizeList);
    
        ............
        //设置相机预览尺寸
        //TODO 在你设置视频大小的地方也是用这里计算出来的值,以为我设置录制视频分辨率的地方不在,
    //这,不过也是取得这里的值,所以就不写了                               
    myParameters.setPreviewSize(prviewSizeList.get(selectIndex).width,prviewSizeList.get(selectIndex).height);
    
    }
    
    int mRealSizeWidth;//手机屏幕真实宽度
    int mRealSizeHeight;//手机屏幕真实高度
    
     /**
       * 查找最接近屏幕宽高比的参数
       * @param cameraSizeList
       * @return
       */
    public int bestVideoSize(List<Camera.Size> cameraSizeList) {
            if (cameraSizeList == null) {
                return -1;
            }
            //计算屏幕的实际分辨率的比值
            float realRatio = ((float) mRealSizeWidth / (float) mRealSizeHeight);
            int index = 0;//目标索引
            float outRatio = -1f;
            for (int i = 0; i < cameraSizeList.size(); i++) {
                if (cameraSizeList.get(i).height <= mRealSizeHeight) {//取的值高度不能高于屏
    //幕真实高度
                    float ratio = (float) (cameraSizeList.get(i).width) / (float) (cameraSizeList.get(i).height);
                    if (outRatio == -1f) {
                        outRatio = Math.abs(ratio / realRatio - 1);
                        index = i;
                    } else {
                        if (outRatio > Math.abs(ratio / realRatio - 1)) {
                            //取绝对值小的值,即选择与屏幕分辨率最接近的值
                            index = i;
                            outRatio = Math.abs(ratio / realRatio - 1);
                        }else if (outRatio == Math.abs(ratio / realRatio - 1)) {
                            //如果有两组长宽比完全一样的,选择height比较大,小的可能会视频模糊
                            if (cameraSizeList.get(i).height >= cameraSizeList.get(index).height) {
                                index = i;
                                outRatio = Math.abs(ratio / realRatio - 1);
                            }
                        }
                    }
    
                }
            }
            return index;
        }
    
    
    //计算屏幕真实分辨率
    public void getScreenSize() {
            WindowManager windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
            Display display = windowManager.getDefaultDisplay();
            Point outPoint = new Point();
            if (Build.VERSION.SDK_INT >= 19) {
                // 可能有虚拟按键的情况
                display.getRealSize(outPoint);
            } else {
                // 不可能有虚拟按键
                display.getSize(outPoint);
            }
    
            mRealSizeHeight = outPoint.y;
            mRealSizeWidth = outPoint.x;
        }

    注意:我录的是横屏,所以我比较的都是高度height,如果是竖屏,最好是用宽度width。

          安卓手机的各种各样的分辨率问题不再多说了,没办法把所有的都测一遍,从我手里的一批手机测过后都是达到了比较完美的效果(除非你手机的相机有支持与屏幕比例一模一样的分辨率,否则几乎不会是完全的全屏,最终的效果也会因手机不同有些许差异),如果有不合适的,可以在bestVideoSize()方法里通过限制你要取值的height的高度范围这个方向考虑。

    展开全文
  • Android怎么录屏,Android录屏命令,Android录制Gif,视频怎么转gif。
  • Android录屏截图功能

    千次阅读 2017-05-15 08:00:03
    录屏的前三步和截屏是一样的,出现分歧点的地方在于 VirtualDisplay 创建时传入的 Surface,还记得我们上面说的吗,说在创建 VirtualDisplay 的时候,传入一个 SurfaceView 的 Surface 的话,那么你在真实屏幕上的...
  • Android录屏功能的实现

    2021-01-04 17:26:43
    最近做一个Android开发的项目用到了录屏的功能,开始查阅了一些资料和博客,基本上都是在讨论ROOT的。直到后来在github上看到一个比较新的代码,才恍然发现,Android 5.0时候开放了一个新的接口—android.media....
  • Android 录屏服务使用(源码)

    千次阅读 2018-04-23 12:11:57
    Android 录屏服务使用(源码) 从Android 5.0开始,可以对手机进行录屏,使用场景:如错误场景的视频上传,简单屏幕获取等,下面贴出使用用例和对使用的类一个简单的介绍 - MediaProjection - MediaRecorder - ...
  • Android 录屏功能

    2018-09-11 18:28:07
    实现了录制手机截屏实时推流到服务器 借鉴https://blog.csdn.net/zxccxzzxz/article/details/54150396 难点 : 运行时录制功能 获取音频 设备是通过扬声器传出 后改用 监听 AudioSource.REMOTE_SUBMIX 实现监听...
  • Android实现录屏截屏功能

    千次阅读 2020-04-26 00:44:13
    Android实现录屏截屏功能1. MediaProjectionManager介绍2.所需权限3.示例代码 1. MediaProjectionManager介绍 用于获取screen capture的主要类,在Android 5.0(Api Level 21)时添加。 核心方法: (1)创建:...
  • android 录屏方案 VFR和CFR

    千次阅读 2019-09-02 22:11:04
    android 5.0录屏的例子网上满天飞,我这里主要是总结一下,如何以VFR和CFR的方式来录屏。写这篇文章主要是因为我在做这个功能的过程中,在网上找了很久也没有找到一个固定帧率录屏的例子,后面还是在全球最大同性...
  • Android录屏并利用FFmpeg转换成gif(一) 录屏 写博客时经常会希望用一段动画来演示app的行为,目前大多数的做法是在电脑上开模拟器,然后用gif录制软件录制模拟器屏幕,对于非开发人员来讲这种方式还是比较困难的...
  • Android studio录屏截图工具

    千次阅读 2018-12-18 17:10:12
    Android studio录屏截图工具
  • 前言 公司游戏产品实现游戏录屏功能(内录),调研了一圈将调研结果罗列一下。 内录:只录制游戏内的声音,不包含手机mic声音。 外录: 手机麦克声音。 调研 部分排名靠前的录屏软件 [内录+外...Android 5.0 + 系统...
  • webRTC(二十一):android 录屏功能

    千次阅读 2020-03-03 22:58:21
    录屏截屏的思路基本一致,请看详细代码 布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match...
  • android录屏 h264裸流

    2018-10-30 17:07:46
    H264裸流测试流,是android Mediaprojection 获取的,亲测可以用vlc播放
  • Android 悬浮窗、屏幕推流与录屏截屏项目需求声明1. 打开应用后直接显示桌面悬浮窗1). 解决Launcher Activity闪屏问题2). 添加悬浮窗2. 屏幕推流3. 补充关于录屏和截屏1). 录屏2). 截屏 项目需求声明 打开应用后...
  • Android 禁止 截屏 录屏

    千次阅读 2020-01-02 17:30:12
    喜欢可以加群号:913934649 ...Android app 常常考虑安全,会禁止用户截屏,录屏 在没有root的情况下,只需要加一行代码即可解决这个问题 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); ...
  • 1截屏接口 在Android5.0之前如果希望截图屏幕,是需要获取系统root权限的。但在Android5.0之后Android开放了新的接口android.media.projection,开发者使用该接口,第三方应用程序无需再获取系统root权限也可以直接...
  • android VLC可实现rtsp播放 录屏 截图等功能
  • 在做手机端电视直播应用时候,使用的ijkplayer,业务需要增加录制缓存、截屏、投屏及其基本的播放功能等。 屏幕录制是参考 简书 ijkplayer开启rtsp,并且支持录制和截图功能 来做的, 当时评论里面留了言,然后很多人...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,575
精华内容 630
关键字:

android录屏截屏