QML for Android通过ScreenRecorder录制屏幕并保存为本地视频
2017-06-23 11:57
555 查看
前言
最近在学习android截屏相关的知识点,找了很多资料,终于在github上找到一个源码ScreenRecorder,感谢这位哥们的无私奉献,然后又有一篇专门针对这个源码做详细讲解的文章,通过文中的分析,大致了解了其工作原理,我一直是做Qt方面的开发,对于android原生方面其实并不是很熟悉,这次通过这两位大神的文章然后新建一个Qt Quick工程,用QML来实现界面,通过调用ScreenRecorder的接口来实现android端屏幕录制并保存为视频文件,亲测可用,效果也非常好,再次感谢ScreenRecorder原作者的源码贡献。代码结构很简单,有需要的童鞋可以去阅读源码。正文
OK,废话不多说,开始来叨叨我的工程结构。新建Quick工程
这个很简单,就不多说了吧。我这里创建一个名为AndroidScreenRecorderTest的工程。创建AndroidManifest.xml和Java文件
这个在上一篇文章已经详细讲过了(查看),然后将ScreenRecorder.java文件拷贝到同级目录,如图修改MainActivity.java文件
在MainActivity.java中添加我们需要访问的接口,一个是开始录制接口,一个是停止录制接口。注意,接口一定要声明为静态才行。来看看代码package com.tl.screen; import android.content.Intent; import android.media.projection.MediaProjection; import android.media.projection.MediaProjectionManager; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import java.io.File; import android.view.Window; import android.view.WindowManager; import android.content.Context; import android.util.DisplayMetrics; import android.view.Display; public class MainActivity extends org.qtproject.qt5.android.bindings.QtActivity{ private static final int REQUEST_CODE = 1; private static MediaProjectionManager mMediaProjectionManager; private static ScreenRecorder mRecorder; private static MainActivity m_instance; public WindowManager wm; public MainActivity(){ m_instance = this; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //noinspection ResourceType Log.e("MainActivity","onCreate.."); mMediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE); wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.e("MainActivity", "onActivityResult..."); MediaProjection mediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data); if (mediaProjection == null) { Log.e("@@", "media projection is null"); return; } // video size final int width = wm.getDefaultDisplay().getWidth(); final int height = wm.getDefaultDisplay().getHeight(); Log.i("MainActivity","width = " + String.valueOf(width) + " height = " + String.valueOf(height)); File file = new File(Environment.getExternalStorageDirectory(), "record-" + width + "x" + height + "-" + System.currentTimeMillis() + ".mp4"); final int bitrate = 3000000; //默认是6000000 mRecorder = new ScreenRecorder(width, height, bitrate, 1, mediaProjection, file.getAbsolutePath()); mRecorder.start(); // Toast.makeText(this, "Screen recorder is running...", Toast.LENGTH_SHORT).show(); moveTaskToBack(true);//回到桌面 } @Override protected void onDestroy() { super.onDestroy(); if(mRecorder != null){ mRecorder.quit(); mRecorder = null; } } public static void startRecord(){ Log.i("MainActivity","startRecord.."); Intent captureIntent = mMediaProjectionManager.createScreenCaptureIntent(); m_instance.startActivityForResult(captureIntent, REQUEST_CODE); } public static void stopRecord(){ Log.i("MainActivity","stopRecord.."); if (mRecorder != null) { mRecorder.quit(); mRecorder = null; } } }
其中ScreenRecorder.java文件内容不用变,直接是从GitHub上下载的源码。
定义访问java接口的类文件
我这里单独定义了一个单例类来封装访问java接口,这样便于管理。#include "androidinterface.h" AndroidInterface * AndroidInterface::m_pInstance = NULL; AndroidInterface *AndroidInterface::GetInstance() { if(m_pInstance == NULL){ m_pInstance = new AndroidInterface(); atexit(Release); } return m_pInstance; } void AndroidInterface::Release() { if (m_pInstance) { delete m_pInstance; m_pInstance = NULL; } } void AndroidInterface::startRecord() { QAndroidJniObject::callStaticMethod<void>("com/tl/screen/MainActivity", "startRecord", "()V"); } void AndroidInterface::stopRecord() { QAndroidJniObject::callStaticMethod<void>("com/tl/screen/MainActivity", "stopRecord", "()V"); } AndroidInterface::AndroidInterface(QObject *parent) : QObject(parent) { }
设计界面
在QML中做一个简单的界面,这里只需要两个按钮–开始和结束。修改main.qml文件,如下
import QtQuick 2.6 import QtQuick.Window 2.2 import QtQuick.Controls 1.4 Window { id:root visible: true width: 720 height: 1080 Column{ Button{ width: root.width/3.0 height: width/2. text: "start recorde" onClicked: { androidInterface.startRecord() } } Button{ width: root.width/3.0 height: width/2. text: "stop recorde" onClicked: { androidInterface.stopRecord() } } } }
OK,主要代码已贴完了,点击开始录制按钮会自动进入到手机桌面,录制完成后会将视频文件存储在系统根目录下。
源码下载
本文参考
http://blog.csdn.net/zxccxzzxz/article/details/54150396
https://github.com/yrom/ScreenRecorder
相关文章推荐
- android 视频录制 保存到本地
- android前置竖屏摄像头录制视频保存到本地
- Android5.0以上实现对手机屏幕录制并将视频实时保存到本地(亦可实时传输)
- 【Android应用实例00】 用摄像头录制视频并本地保存
- android mediarecorder 录制音频并通过socket,存储到本地
- Qt for android 截屏、Qml保存图片到本地
- Android通过发送Intent播放本地视频和网络视频
- android 通过Camera和Surfaceview实现照相 图片预览 保存图片到本地 手动聚焦 FaceDetectionListener实现人脸识别
- Android 4.4自带屏幕录制命令screenrecord ,去掉180s限制
- Android如何录制视频过程中切换保存路径?【已解决】
- Android多媒体录制--MediaRecorder视频录制
- Android视频录制命令screenrecord
- android实时录制视频h263编码通过rtp打包udp发送到服务器
- Android将list数据通过LitePal保存到本地(集合保存到本地)
- [Android]从视频流读取帧图像保存到本地
- Android:screenrecord录制屏幕录像
- 通过surface.screenshot函数可以获取android视频播放的屏幕截图
- 【lizhi125】免费且实用的软件截图+屏幕视频录像工具——Free Screen Video Recorder
- Android 获取屏幕截图 和保存到本地的sd卡路径下
- Android 如何通过 Windows 录制视频