android录制视频源码
❶ Android实现录屏MediaProjection以及相关异常解决
需要实现一个手机的录屏功能,于是从网上找了些相关资料和源码,发现跑不起来,于是开始bug,发现坑还是很多的,这里记录一下实现过程和一些些遇到的异常以及一个我调整完可以跑的Demo。
首先在AndroidManifest中静态配置权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
然后在Activity中动态申请
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_REQUEST_CODE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[] {Manifest.permission.RECORD_AUDIO}, AUDIO_REQUEST_CODE);
}
因为项目中需要用到一个自定义的Application,所以要需要配置一个全局的Application,同样在AndroidManiest中在application添加自定义的类名,如果在里面启动服务了也要一并配置。
<application
android:name=".RecordApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</application>
然后可以使用封装好的实现其录屏功能的service,这个封装类是网上找的,看很多人在用,我解决了一些异常,并根据自己需求修改了一下。
其中主要异常有:
1.mediaRecorder报空指针,解决方案,在声明的时候声明为静态
private static MediaRecorder mediaRecorder;
2.mediaRecorder.start()方法异常,在每次调用stop时要先调用
mediaRecorder.stop();
mediaRecorder.release();
两个方法,并将
mediaRecorder = null。
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC)异常,这里是设置音频源,可尝试将参数改为
MediaRecorder.AudioSource.DEFAULT
4.stop方法异常,如果是running状态不正常,可能是其状态丢失,需要将声明的running也改为静态的
0.增加需求,在生成视频时大部分人都会根据mediaRecorder.setVideoSize(width, height);方法来定死视频大小,导致一些手机会解析不了,或者是视频比屏幕小,这里提供一种根据屏幕大小动态设置视频大小的方法。
这里就要用到我们之前定义的全局的Application,然后调用getInstance()获取其实例,
然后通过
DisplayMetrics dm = RecordApplication.getInstance().getResources().getDisplayMetrics();
private int width = dm.widthPixels;
private int height = dm.heightPixels;
private int dpi = dm.densityDpi;
来获取屏幕的长、宽和dpi的值,这里不用WindowsManager方法是因为我是在非Activity去获取屏幕长宽的,所以用了getDisplayMetrics();
这样这个功能基本就是实现了。
Demo地址: https://github.com/han103070/Screencap
❷ android 录制屏幕怎么实现
第一步:
下载 ADB工具包,并将其解压缩到任意硬盘根目录。由于屏幕录制功能默认是隐藏的,因此需要 ADB 工具予以协助。
第二步:
在手机设置中的“开发人员选项”中开启“USB调试”,而后使用USB线将手机连接电脑。部分设备还需要允许 USB 调试授权。
第三步:
按下“WIN键+R”,输入“cmd”并回车,打开cmd命令符工具。
输入你的存放根目录的盘符(例如E:),回车。
输入cd adb,切换到ADB工具文件夹。
输入adb shell,测试是否可以正常连接手机。若显示 shell@XX:/ $(XX为你的机型名),则连接正常,按“Ctrl键+C”退出测试。
输入命令后若提示 error:device not found ,可在电脑下载豌豆荚 ,打开USB调试后连接手机安装驱动即可。
第四步:
输入 adb shell screenrecord /sdcard/XXX.mp4 (XXX为视频文件名,可自定义),开始录制手机屏幕,视频格式为 mp4,存放到手机sd卡中,默认录制时间为180s,中途可按“Ctrl键+C”停止录制。
注意事项:
输入 --time-limit N:限制视频录制时间为N秒。如果不限制,默认180秒。
输入 --size N*N:限制录制视频分辨率为N*N。如果未指定,默认使用手机的分辨率。
输入 --bit-rate:指定视频的比特率为6Mbps。如果不指定,默认为4Mbps。
某些设备可能无法直接录制,原因是分辨率太高。如果遇到此类问题,系统将自行指定较低的分辨率。
不支持录制过程中屏幕旋转,如果录制过程中旋转,有可能画面被切断。
无法同步录制音频。
❸ Android录制视频,可限制时长,限大小
Android 录制视频:
public static voidrecordVideo(Context context, intlimit_time, intsize) {
Intent intent =newIntent();
intent.setAction(MediaStore. ACTION_VIDEO_CAPTURE );
intent.putExtra(MediaStore. EXTRA_VIDEO_QUALITY ,1);
intent.addCategory(Intent. CATEGORY_DEFAULT );
if(size !=0) {
//大小限制是long型,int 型无效,所以后边要写一个L
intent.putExtra(MediaStore. EXTRA_SIZE_LIMIT ,size *1024*1024L);//限制录制大小(10M=10 * 1024 * 1024L)
}
if(limit_time !=0) {
intent.putExtra(MediaStore. EXTRA_DURATION_LIMIT ,limit_time);//限制录制时间(10秒=10)
}
File videoFile =createVideoFile(context);
if(videoFile !=null) {
intent.putExtra(MediaStore. EXTRA_OUTPUT ,Uri.fromFile(videoFile));
context.startActivityForResult(intent, CAPTURE_VIDEO_CODE );
}
}
❹ Android调用系统相机实现拍照和视频录制
(1)申请权限
(2)设置布局
这里做了一个简单的布局:添加了一个按钮和一个ImageView控件用于显示拍摄的图像。
(3)为按钮添加点击事件监听
点击按钮时,调用系统相机进行拍照,并在确定后将图像显示在ImageView控件中。
(1)申请权限
(2)设置布局
添加了一个按钮和一个VideoView控件用于显示录制的视频。
(3)为按钮添加点击事件监听
同前面一样,点击按钮后调用系统相机进行录制视频,录制完成后点击确定即可将录制的视频显示在VideoView控件中。
对于Android11.0的版本,在调用系统相近进行视频录制的时候,即使在AndroidMenifest.xml中申请了CAMERA权限,还是会在程序运行时报错: Permission Denial , . .... .... with revoked permission android.permission.CAMERA
解决方法是在程序中动态申请权限:
写在最后:文章是在学习过程中做的学习笔记,同时与志同道合者分享,文章内容均经过我自己实验证实可行,如有问题欢迎留言,很高兴一起交流讨论,共同进步!
❺ android 录像,每隔30秒自动存一下视频 代码如何实现谢谢!
需要实时录得话,中间会有延迟的,就是录制完一段,再录另一段的时候中间会卡顿下,然后你把mediaRecorder设置上录制监听器setOnInfoListener,它会回调的,然后你重新初始化录制器,再录制呗,强调一点:中间一定会有延迟,除非你重写录制器,底层文件存储自己搞。
❻ 现在 做了个 android 视频录制的程序 ,后置摄像头总是旋转90度,如何用代码实现正常。
MediaRecorder 中一个方法setCamera();所以可以先设置好摄像头的参数,然后再设置到MediaRecorder 中(但是录制前需要解锁)。
部分关键的代码如果下:
//初始化相机信息
Camera mCamera = Camera.open();
Camera.Parameters params = mCamera.getParameters();
mCamera.setDisplayOrientation(90);//旋转了90度,最好先判断下JDK的版本号,再决定旋转不
mCamera.setParameters(params);
mCamera.stopPreview();
mCamera.unlock();//解锁
videoMediaRecorder.setCamera(mCamera);
❼ ADB录制视频 Android 视频录制命令 screenrecord
在Android 4.4(Kitkat - API level 19)上集成了一个比较好用的视频(.mp4格式)录制功能 – screenrecord 。
使用方法
1. 基本用法
$ adb shell screenrecord /sdcard/myscreenrecord.mp4
/sdcard/myscreenrecord.mp4 为视频录制文件路径
录制默认分辨率,默认4Mbps,默认180s的视频,保存到sdcard上名为myscreenrecord.mp4
2. 旋转(参数:–rotate)
$ adb shell screenrecord --rotate /sdcard/myscreenrecord.mp4
旋转90度
3. 指定分辨率(参数:–size)
$adb shell screenrecord --size 112x112 /sdcard/myscreenrecord.mp4
分辨率为112x112,建议不要指定分辨率,使用默认分辨率效果最佳;
注意,分辨率不是完全可以随意定制的,比如在我手机上录制100x100的会提示错误:
The max width/height supported by codec is1920x1088
100x100is not supported by codec, suggest to set it as112x112
4. 指定比特率(参数:–bit-rate)
$adb shell screenrecord --bit -rate 8000000 /sdcard/myscreenrecord.mp4
设置比特率为8Mbps,比特率越大,文件越大,画面越清晰;
5. 限制录制时间 (参数: –time-limit)
$adb shell screenrecord --time -limit 10 /sdcard/myscreenrecord.mp4
限制视频录制时间为10s,如果不限制,默认180s
6. 导出视频
$adb pull /sdcard/myscreenrecord.mp4
7. 注意
请关注视频文件生成大小,根据自身情况而定;
暂不支持声音;
咱时不支持模拟器录制( 模拟器录制看这里 ),出现如下提示:Unable to get output buffers (err=-38)
Encoder failed (err=-38),可认为是此原因;
8. 命令查看
adb shell screenrecord --help
Usage: screenrecord [options]
Records the device's display to a .mp4 file.
Options:
--size WIDTHxHEIGHT
Set the video size, e.g."1280x720". Default is the device's main
display resolution (if supported), 1280x720if not. For best
results,use a size supported by the AVC encoder.
--bit -rate RATE
Set the video bit rate, in megabits per second. Default4Mbps.
--time -limit TIME
Set the maximum recording time, in seconds. Default / maximum is180.
--rotate
Rotate the output90 degrees.
--verbose
Display interesting information on stdout.
--help
Showthis message.
Recording continues until Ctrl-C is hit or the time limit is reached.