开发准备
5. 开发准备
5.1 开发环境
5.2 设备以及系统要求
- 系统要求:Android 4.3 (API 18) 及其以上
5.3 下载和导入 SDK
SDK 主要包含 demo 代码、sdk jar 包,以及 sdk 依赖的动态库文件,说明如下:
文件名称 | 功能 | 大小 | 备注 |
---|---|---|---|
pldroid-shortvideo-x.y.z.jar | SDK 库 | 552KB | 必须依赖 |
libpldroid_shortvideo_core.so | 短视频核心库 | 690KB | 必须依赖 |
libpldroid_beauty.so | 美颜模块 | 598KB | 不使用内置美颜可以去掉 |
libpldroid_amix.so | 混音模块 | 229KB | 不使用混音功能可以去掉 |
libpldroid_encoder.so | 软编拍摄模块 | 1.5MB | 不使用软编拍摄功能可以去掉 |
libpldroid_crash.so | 崩溃分析模块 | 82KB | 不使用崩溃分析功能可以去掉 |
libQMedia.so | 图片转场拼接模块 | 9.1MB | 不使用图片转场拼接可以去掉 |
filters | 内置滤镜缩略图 | 12.5MB | 可以根据需求删减 |
5.4 修改 build.gradle
双击打开您的工程目录下的 build.gradle
,(代码中的x.y.z
为具体的版本号)确保已经添加了如下依赖,如下所示:
-
dependencies {
-
compile files('libs/pldroid-shortvideo-x.y.z.jar')
-
compile 'com.qiniu:qiniu-android-sdk:8.4.3'
-
}
5.5 添加相关权限
在 app/src/main 目录中的 AndroidManifest.xml 中增加如下 uses-permission
声明:
-
<uses-permission android:name="android.permission.CAMERA" />
-
<uses-permission android:name="android.permission.RECORD_AUDIO" />
-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
<uses-permission android:name="android.permission.INTERNET" />
-
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
6. 快速开始
从 v3.1.0 版本开始,需要在 Application 中初始化 sdk:
-
PLShortVideoEnv.init(getApplicationContext());
6.1 视频拍摄
6.1.1 创建录制对象
-
PLShortVideoRecorder mShortVideoRecorder = new PLShortVideoRecorder();
-
mShortVideoRecorder.setRecordStateListener(this);
6.1.2 配置采集参数
PLShortVideo
提供了丰富的自定义录制选项,可以通过创建以下对象进行配置:
-
// 摄像头采集选项
-
PLCameraSetting cameraSetting = new PLCameraSetting();
-
cameraSetting.setCameraId(PLCameraSetting.CAMERA_FACING_ID.CAMERA_FACING_FRONT);
-
cameraSetting.setCameraPreviewSizeRatio(PLCameraSetting.CAMERA_PREVIEW_SIZE_RATIO.RATIO_4_3);
-
cameraSetting.setCameraPreviewSizeLevel(PLCameraSetting.CAMERA_PREVIEW_SIZE_LEVEL.PREVIEW_SIZE_LEVEL_480P);
-
-
// 麦克风采集选项
-
PLMicrophoneSetting microphoneSetting = new PLMicrophoneSetting();
-
-
// 视频编码选项
-
PLVideoEncodeSetting videoEncodeSetting = new PLVideoEncodeSetting();
-
videoEncodeSetting.setEncodingSizeLevel(PLVideoEncodeSetting.VIDEO_ENCODING_SIZE_LEVEL.VIDEO_ENCODING_SIZE_LEVEL_480P_1); // 480x480
-
videoEncodeSetting.setEncodingBitrate(1000*1024); // 1000kbps
-
videoEncodeSetting.setEncodingFps(25);
-
videoEncodeSetting.setHWCodecEnabled(true); // true:硬编 false:软编
-
-
// 音频编码选项
-
PLAudioEncodeSetting audioEncodeSetting = new PLAudioEncodeSetting();
-
audioEncodeSetting.setHWCodecEnabled(true); // true:硬编 false:软编
-
-
// 美颜选项
-
PLFaceBeautySetting faceBeautySetting = new PLFaceBeautySetting(1.0f, 0.5f, 0.5f);
-
-
// 录制选项
-
PLRecordSetting recordSetting = new PLRecordSetting();
-
recordSetting.setMaxRecordDuration(10*1000); // 10s
-
recordSetting.setVideoCacheDir("/sdcard");
-
recordSetting.setVideoFilepath("/sdcard/record.mp4");
-
-
// 设置录制速度 (默认为 1.0)
-
PLShortVideoRecorder.setRecordSpeed(1.0);
6.1.3 创建预览窗口
拍摄视频需要的预览窗口为 GLSurfaceView
或者其派生的类对象,可以配置在 XML 文件中,也可以动态创建。
6.1.4 配置录制参数
通过 prepare
把拍摄所选择的参数配置到 SDK 中:
-
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
mShortVideoRecorder.prepare(glSurfaceView, cameraSetting, microphoneSetting,
-
videoEncodeSetting, audioEncodeSetting, faceBeautySetting, recordSetting);
-
}
6.1.5 生命周期
请在 Activity
的各个生命周期的回调中,分别调用 PLShortVideoRecorder
对应的方法:
-
-
protected void onResume() {
-
super.onResume();
-
mShortVideoRecorder.resume();
-
}
-
-
-
protected void onPause() {
-
super.onPause();
-
mShortVideoRecorder.pause();
-
}
-
-
-
protected void onDestroy() {
-
super.onDestroy();
-
mShortVideoRecorder.destroy();
-
}
6.1.6 断点拍摄和保存
基本的配置完成以后,就可以开始断点拍摄了。
-
// 开始一段视频
-
PLShortVideoRecorder.beginSection();
-
// 结束一段视频
-
PLShortVideoRecorder.endSection();
-
// 回删上一段视频
-
PLShortVideoRecorder.deleteLastSection();
-
// 回删所有录制的视频
-
PLShortVideoRecorder.deleteAllSections();
-
// 合成和保存所有的视频片段
-
PLShortVideoRecorder.concatSections();
6.1.7 添加背景音乐
可以通过如下接口添加背景音乐:
-
// 设置 sdCard 上的音乐文件
-
PLShortVideoRecorder.setMusicFile(String filePath);
-
// 设置 Assets 下的音乐文件
-
PLShortVideoRecorder.setMusicAsset(AssetFileDescriptor afd);
-
// 设置音乐文件的播放起始位置
-
PLShortVideoRecorder.setMusicPosition(int position);
-
// 获取音乐文件当前的播放位置
-
PLShortVideoRecorder.getMusicPosition();
-
// 设置是否循环背景音乐
-
PLShortVideoRecorder.setMusicLoop(boolean musicLoop);
需要注意的是,当添加完背景音乐之后,SDK 会自动把麦克风采集给关闭,从而默认使用背景音乐作为最终视频的音频。如果需要麦克风继续采集,那么只需通过设置 PLShortVideoRecorder.mute(false) 即可。
6.1.8 添加水印
PLShortVideoRecorder
支持在录制过程中添加水印,水印的位置是相对于预览分辨率的,可以通过 PLWatermarkSetting
设置水印参数:
-
PLWatermarkSetting mWatermarkSetting = new PLWatermarkSetting();
-
mWatermarkSetting.setResourceId(R.drawable.qiniu_logo);
-
mWatermarkSetting.setPosition(0.01f, 0.75f);
-
mWatermarkSetting.setAlpha(128);
-
PLShortVideoRecorder.setWatermark(mWatermarkSetting);
6.1.9 保存草稿
可以将某次拍摄的所有片段与设置项保存为草稿并持久化保存,之后可以恢复:
-
// 保存草稿
-
PLShortVideoRecorder.saveToDraftBox("My Draft Title");
-
-
// 恢复草稿
-
PLDraft draft = PLDraftBox.getInstance(this).getDraftByTag("My Draft Title");
-
PLShortVideoRecorder.recoverFromDraft(draft);
6.2 屏幕录制
6.2.1 创建录制对象
-
PLScreenRecorder mScreenRecorder = new PLScreenRecorder(this);
-
mScreenRecorder.setRecordStateListener(this);
6.2.2 配置采集参数
PLShortVideo
提供了丰富的自定义录制选项,可以通过创建以下对象进行配置:
-
// 屏幕采集选项
-
public static final String SCREEN_RECORD_FILE_PATH = VIDEO_STORAGE_DIR + "/screen_record.mp4";
-
DisplayMetrics metrics = getResources().getDisplayMetrics();
-
int width = metrics.widthPixels;
-
int height = metrics.heightPixels;
-
int dpi = metrics.densityDpi;
-
mScreenRecorder = new PLScreenRecorder();
-
PLScreenRecorderSetting screenSetting = new PLScreenRecorderSetting();
-
screenSetting.setRecordFile(SCREEN_RECORD_FILE_PATH)
-
.setInputAudioEnabled(false)
-
.setSize(width, height)
-
.setDpi(dpi);
-
-
// 音频(麦克风/外部导入)参数信息
-
PLMicrophoneSetting microphoneSetting = new PLMicrophoneSetting();
6.2.3 配置录制参数
通过 prepare
把屏幕录制所选择的参数配置到 SDK 中:
-
mScreenRecorder.prepare(screenSetting, microphoneSetting);
6.2.4 申请屏幕录制权限
屏幕录制需要得到用户授权,通过下面接口申请用户权限:
-
mScreenRecorder.requestScreenRecord();
调用该接口后,系统会自动弹出申请权限对话框,用户的操作结果会通过 onActivityResult 系统回调接口返回:
-
-
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-
if (requestCode == PLScreenRecorder.REQUEST_CODE) {
-
if (data == null) {
-
String tip = "录屏申请启动失败!";
-
mScreenRecorder.stop();
-
mScreenRecorder = null;
-
return;
-
}
-
-
mScreenRecorder.onActivityResult(requestCode, resultCode, data);
-
}
-
}
6.2.5 开始录制
用户授权后且录制状态为 Ready 后可通过 start() 方法开始屏幕录制:
-
public void onReady() {
-
mScreenRecorder.start();
-
}
6.2.6 结束录制
通过下面接口结束屏幕录制:
-
mScreenRecorder.stop();
6.2.7 Android 10 适配
请在 AndroidManifest.xml 中添加此项 Service
-
<service
-
android:name="com.qiniu.pili.droid.streaming.screen.ScreenRecordService"
-
android:enabled="true"
-
android:foregroundServiceType="mediaProjection" />
并声明前台服务的权限
-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />