- 工程:分为剪辑工程(IQEWorkSpace)和卡点视频工程(ISlideWorkSpace),后续统称workspace。其中小影提供的所有剪辑玩法,都是针对剪辑工程进行的操作。卡点视频即使用素材一键生成大片,目前仅支持片段替换和片段排序。
- 播放流:每个工程会独立的播放流,将播放器View和工程绑定后,即可完成视频流的显示。同时可以对工程的播放器做相关操作。
- 主题:theme,一系列效果的合集,包括片头、片尾、转场、音乐、滤镜等。对工程设置主题,可以实现模板视频功能。
- 片段:Clip,片段可以是图片或视频,是工程的基础组成部分。工程将按片段顺序生成一段视频。
- 转场:Transition, 转场效果是设定在两个片段之间的,是两个片段的切换效果。
- 滤镜/特效滤镜:Filter/FxFilter,是添加给单个片段的,覆盖整个片段,可以实现调色滤镜、边框滤镜、特效滤镜等。
- 效果:Effect,贴纸、画中画、字幕、特效、马赛克,都属于效果,是直接在工程上增加的效果。水印也是一种特殊的效果。
- 图层:Layer,Clip都在同一个图层中,效果和音频可以设置自己的图层,图层的层级大小将影响工程视频的实际效果。详情可以参考【基础结构和概念】中的【图层轨道】一节。
- 音频:Audio,音频也是一种特殊的效果。分为背景音乐、音效和录音。背景音乐都在同一图层中,即一个时间点不可同时存在多个音频;音效和录音则可以单独设置图层,即一个时间点可以同时存在多个音频。
- 源文件区间:SrcRange,片段中表示加入片段源文件的起始点和长度,效果中表示效果裁剪的起始点和长度。详情可以参考【基础结构和概念】中的【Range相关】一节。
- 裁剪区间:TrimRange,裁剪片段的起始点和长度。详情可以参考【基础结构和概念】中的【Range相关】一节。
- 出入区间:DestRange,效果在工程上的起始点和长度。详情可以参考【基础结构和概念】中的【Range相关】一节。
- 导出:Export,将工程以指定分辨率、码率、帧速率和压缩格式输出文件。
- 码率:Bitrate,每秒传送的比特数,码率越高,导出视频质量越好。
- 帧速率:FPS,每秒刷新图像的帧数,帧速率越高,视频的连续性越好。
- 素材包:一种资源文件,用于给工程添加效果使用。特地效果有特地的素材包,主题和卡点视频主题也都有素材包。详情可以参考【素材管理】一节。
- 素材包ID:素材包的唯一标识,安装素材后,可以通过解析素材获取。详情可以参考【素材管理】一节。
-
输入规范:
视频格式:MP4、MOV、WMV。 音频格式:MP3、AAC、M4A。 图片格式:JPG、PNG。 视频编码:H264、WMV、MPEG4。 音频编码:MP3、AAC。
-
输出规范:
视频格式:MP4、MOV 视频编码:H264 音频编码:AAC
剪辑SDK核心模块包括剪辑工程、片段、音频、效果、播放器等。
剪辑工程是SDK中最基础的模块,它负责生成、保存并维护SDK引擎剪辑的上下文环境。片段是工程的基础,是导出视频的组成元素。效果包括贴纸、画中画、字幕、特效、水印、马赛克等,各种效果、音频和片段共同组合形成最终的视频输出。片段上可以添加各种滤镜,片段之间可以设置不同的转场效果。
效果和音频可以在指定区间设置自己的图层(水印和背景音乐除外),高图层的效果可以对低图层的效果起作用或遮挡低图层效果。当两个效果在同一图层时,如果出入点时间不覆盖,则不互相影响;如果出入点时间覆盖,则覆盖时间区间的效果将无法预期。所以尽量给每个效果设定独立的图层,以免最终视频效果不符合预期。
图层限制区间: 音效/录音图层:[10,10000),左边闭区间,右边开区间。 效果图层:[10000,1000000),左边闭区间,右边开区间。(贴纸、字幕、画中画、特效、马赛克)
例: 1)贴纸1在图层100000,贴纸2在图层90000,如果贴纸1和贴纸2的位置和时间相同时,则贴纸1会遮挡贴纸2。 2)特效1在图层100000,贴纸1在图层90000,贴纸2在图层110000,如果特效1、贴纸1和贴纸2的时间相同,则特效对贴纸1产生影响,不对贴纸2产生影响。
srcRange::源文件区间,视频源文件选择的时间区间。 trimRange:裁剪区间,裁剪片段的起始点和长度。 destRange:出入区间,效果在工程上的起始点和长度。
剪辑中使用的正常坐标系,统一使用视频流(stream)的坐标系,即视频流的左上角为(0, 0),右下角为(stream.width,stream.height)。角度水平向右为0度,顺时针为增大。
剪辑中使用的万分比坐标系,统一使用视频流转化为对应比例的坐标系,即视频流的左上角为(0, 0),右下角为(10000,10000)。 即把stream映射到万分比左边中,10000级表示 stream.width或stream.height。
由于剪辑需要始终保持单线程操作,所以在工程剪辑时,我们将每个操作定义为一个剪辑操作符BaseOperate。剪辑操作符有sdk已经预设的大量操作符,开发者也可以自行组合实现新的操作符。执行时,开发者只需要创建操作符,并将操作符交给workspace执行即可,接下来就是等待执行完成的回调。
BaseOperate operate = new BaseOperate();
workspace.handleOperation(operate);
为满足开发者可能存在的特殊需求,操作符也可以进行同步操作,使用代码:
BaseOperate operate = new BaseOperate();
workspace.syncOperation(operate);
由于工程操作时,必须保证只有单个操作正在执行,所以操作符建议只使用一种方式,或者在异步操作完成时,再进行同步操作。 需要注意的是,同步操作暂不支持【高级玩法-对撤销/重做的支持】,强烈建议尽量使用操作符的异步编辑方式。以免出现不必要的并发问题。
为了方便开发者进行开发,可以先下载适用于Android Studio的Demo代码。强烈建议使用Android Studio(http://developer.android.com/sdk/index.html)进行开发。
请向趣维公司申请允许使用剪辑SDK的license文件,该文件具备有效期。如有升级需要,请自行实现更新系统。
对剪辑SDK文档中的名词解释和基础结构与概念先做了解。
1)剪辑SDK使用的minSdkVersion是21。为了保证兼容性,请在创建工程时将minSdkVersion设置为21。
打开Android Studio,新建工程如下,填写Application name和Company Domain。点击Next。将minimum SDK更改为API 21:Android 5.0(Lollipop)。点击Finish。
2)在项目根目录的build.gradle文件中,添加配置
allprojects {
repositories {
google()
jcenter()
maven {
url 'https://serverless-1533657941-maven.pkg.coding.net/repository/app-sdk-pub/bintray/'
}
}
}
3)在app目录的build.gradle中,添加配置,ndk可以根据实际需要选择配置,以降低APK包体大小,当前支持armeabi、armeabi-v7a、arm64-v8a。
android {
defaultConfig {
ndk {
// 按需选择,以降低APK包体大小
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a"
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
}
dependencies {
//剪辑SDK
implementation "com.quvideo.mobile.external:sdk-engine:4.5.0"
}
在开始使用剪辑功能前,必须对剪辑SDK初始化
QEInitData.Builder builder = new QEInitData.Builder(licensePath);
QEEngineClient.init(context, builder.build());
QEInitData参数说明:
名称 | 解释 | 类型 | 是否必须 |
---|---|---|---|
licensePath | license文件路径地址,可以是assets目录。(注意:android 10以上只支持放在私有目录中,请保证使用完整绝对路径) | String | 必须 |
projectDir | 剪辑工程文件存放路径,默认存放剪辑工程的地址,删除APP或清除用户数据时会被清除(注意:android 10以上只支持放在私有目录中,请保证使用完整绝对路径的目录) | number | 非必须 |
hwCodecCapPath | 设备软硬件配置文件(注意:android 10以上只支持放在私有目录中,请保证使用完整绝对路径) | string | 非必须 |
corruptImgPath | clip错误时显示图片地址(注意:android 10以上只支持放在私有目录中,请保证使用完整绝对路径) | string | 非必须 |
isUseStuffClip | 是否末尾补黑帧,默认false(详解【高级玩法-自由黑帧模式】一章说明) | boolean | 非必须 |
iTextPrepareListener | 默认文本宏替换数据 | ITextPrepareListener | 非必须 |
注意: 简单的xyt文件和license文件支持放在assets目录中直接使用,但是路径名有规范,必须以"assets_android://"开头,如: "assets_android://qvlicense/license.txt" 和 "assets_android://quvideo/trans/0x030000000000012D.xyt"。
同一个素材,只需要安装一次即可,后续直接通过素材id即可查询素材信息。
注意: 1.assets目录下的素材安装,每次需要完整列表重新安装,会进行增删处理。对于asset目录下的素材,升级时如有需要,可以完整重新安装一次,用于素材变更。 2.android 10 以上只支持放在私有目录中,所有素材请保证使用完整绝对路径
/** 安装单个素材文件,zip包或者xyt文件 */
XytManager.install(xytZipPath, xytInstallListener);
/** List<String> xytZipPaths,zip包或者xyt文件列表 */
XytManager.install(xytZipPaths, xytInstallListener);
/** 安装多个asset目录下的素材文件,只能是xyt文件列表 */
XytManager.installAsset(assetPathList, xytInstallListener);
/** 卸载单个素材,只能是xyt文件列表,ttid为素材id */
XytManager.unInstall(ttid, xytInstallListener);
XytInstallListener接口信息:
public interface XytInstallListener {
void onSuccess();
/**
* @param filePaths 安装失败的素材文件列表
* @param errorCode 错误码
*/
void onFailed(List<String> filePaths, int errorCode);
}
/**
* 通过素材id查询素材信息
*/
XytInfo xytInfo = XytManager.getXytInfo(ttidLong);
/**
* 通过素材路径查询素材信息
*/
XytInfo xytInfo = XytManager.getXytInfo(xytPath);
XytInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
ttidLong | 素材id | long |
ttidHexStr | 素材id的十六进制 如:0x06000000000000D9 | String |
filePath | 素材路径 | String |
/**
* Long转成16进制ttid字符串
* 如:1225031875203433521-->"0x1100300000080431"
*/
String hexStr = QEXytUtil.ttidLongToHex(ttidLong);
/**
* 16进制ttid转成Long
* 如:""0x1100300000080431"-->1225031875203433521
*/
long ttid = QEXytUtil.ttidHexStrToLong(ttidHexStr);
/**
* 是否mv主题
*/
boolean isMvTheme = QEXytUtil.isMVTheme(ttidLong);
/**
* 获取主题上配置的 获取封面的最佳时间点
*/
int timePos = QEXytUtil.getThemeCoverPos(themePath);
/**
* 获取转场配置时长
*/
int duration = QEXytUtil.getTranDuration(transPath);
/**
* 获取转场时长是否可编辑
*/
boolean isEditable = QEXytUtil.getTranEditable(transPath);
/**
* 获取效果插件素材的所有属性信息
*/
List<SubPluginAttriItem> attriItems = QEXytUtil.getIEPropertyInfo(templateId);
/**
* 获取转场时长是否可编辑
*/
boolean isEditable = QEXytUtil.getTranEditable(transPath);
/**
* 特效素材是否支持添加给画中画
*/
boolean isSupport = isSupportSubFx(String subFxPath);
1)初始化。
创建XYCamreaEngine实例。
XYCameraEngine mXYCamera = new XYCameraEngine(activity, screenSize, ICameraEventCallback);
ICameraEventCallback说明:
public interface ICameraEventCallback {
/**
* 拍照完成
* @param filePath 文件路径
*/
void onCaptureDone(String filePath);
/**
* 录制中回调
* @param duration 录制时长
*/
void onRecorderRunning(long duration);
/**
* 停止录制
*/
void onRecorderStop(WorkThreadTaskItem workThreadTaskItem);
/**
* 暂停录制
*/
void onRecorderPaused();
/**
* 录制准备完成
*/
void onRecorderReady();
/**
* 录制时长溢出
*/
void onRecorderDurationExceeded();
/**
* 录制文件大小溢出
*/
void onRecorderSizeExceeded();
/**
* 人脸检测结果
* 因未集成人脸库,不可用
* @param isDetected 是否检测到人脸
*/
void onFaceDetectResult(boolean isDetected);
/**
* 相机连接结果
* @param isConnected 是否成功
*/
void onConnectResult(boolean isConnected);
/**
* 相机断开连接
*/
void onDisConnect();
/**
* 开始预览
*/
void onPreviewStart();
/**
* 停止预览
*/
void onPreviewStop();
void onPipSrcObjEnd();
}
2)搭建Camera预览
初始化Preview 需要传入FrameLayout作为SurfaceView的父布局,内部会自动创建SurfaceView add到FrameLayout中
mXYCamera.initPreview(mSurfaceContainer);
连接Camera
mXYCamera.openCamera();
注意:连接Camera之前需要确保已申请过Camera权限,如果没有需要向用户申请
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
启动预览 在Camera连接成功的回调中启动预览
@Override public void onConnectResult(boolean isConnected) {
if (isConnected) {
mXYCamera.setDeviceIsPortrait(true,
XYCameraConst.CameraDegrees.DEGREES_PORTRAIT);
// 启动预览
mXYCamera.startPreview();
}
}
关闭Camera
mXYCamera.closeCamera();
停止预览,在Camera断开连接的回调中停止预览
@Override public void onDisConnect() {
mXYCamera.stopPreview();
}
- Camera 录制
开始录制需要传递XYRecorderParam参数,该参数可以自定义一些录制参数。
mXYCamera.startRecording(new XYRecorderParam(filePath,mXYCamera.getOutPutSize(),mXYCamera.getCurCameraId() == XYCameraConst.CameraId.CAMERA_FRONT));
XYRecorderParam参数说明:
名称 | 解释 | 类型 |
---|---|---|
outputFilePath | 视频录制文件路径 | String |
outputSize | 视频录制尺寸 | VeMSize |
isFrontCamera | 是否前置摄像头 | boolean |
暂停录制会返回当次录制的start位置与end位置,这样可以知道本次录制在mp4文件中的range
int[] range = mXYCamera.pauseRecording();
继续录制
mXYCamera.resumeRecording();
停止录制 停止录制同样会返回当次录制的start位置与end位置,如果在当前本来就是暂停录制状态,则可以忽略该range
int[] range = mXYCamera.stopRecording();
设置录制方向 需要固定Activity的屏幕方向android:screenOrientation="portrait" 如果需要横屏录制,可以用以下接口设置。参考XYCameraConst.CameraDegrees
mXYCamera.setDeviceIsPortrait(true, XYCameraConst.CameraDegrees.DEGREES_PORTRAIT);
- Camera设置
切换镜头,参数参见XYCameraConst. CameraId
mXYCamera.switchCameraId(XYCameraConst.CameraId.CAMERA_FRONT);
闪光灯,参数参见XYCameraConst.FlashMode
mXYCamera.getCameraDevice().setFlashMode(XYCameraConst.FlashMode.FLASH_TORCH);
对焦
mXYCamera.getCameraDevice().autoFocus(new Camera.AutoFocusCallback() {
@Override public void onAutoFocus(boolean success, Camera camera) {
}
});
焦距调节
mXYCamera.getCameraDevice().setCameraZoom(zoomValue);
焦距范围0~max
mXYCamera.getCameraDevice().getCameraZoomMax();
曝光调节
mXYCamera.getCameraDevice().setCameraExposure(value);
曝光参数获取
mXYCamera.getCameraDevice().getCameraExposureStep();
mXYCamera.getCameraDevice().getCameraExposureMin();
mXYCamera.getCameraDevice().getCameraExposureMax();
比例调节 参数参见XYCameraConst.RatioMode,第2个参数为距离屏幕上边的距离,用于调节SurfaceView的区域
mXYCamera.setRatio(XYCameraConst.RatioMode.RATIO_4_3, 200);
其他Camera设置,可以使用Camera Parameters来设置
mXYCamera.getCameraDevice().getParameters();
mXYCamera.getCameraDevice().setParameters();
- Camera预览效果设置
滤镜设置
mXYCamera.setEffect(effectPath);
美颜设置 开启美颜,value为默认指。范围为0~100
mXYCamera.initFaceBeautyMode(value);
美颜参数调节
mXYCamera.setFaceBeautyParam(value);
关闭美颜
mXYCamera.clearFaceBeautyParam();
- 拍照
传入照片保存路径。 注意:该照片分辨率为preview size。
mXYCamera.takePicture(filePath);
接收拍照完成回调
@Override public void onCaptureDone(String filePath) {
}
- 音乐镜头 音乐镜头需要结合开发者晚饭,实现逻辑如下:
- 使用MediaPlayer加载音乐
- 在开始录制时,同时播放音乐,录制过程中,音乐会同时录制进去
- 选取一段音乐就是加载音乐后,seek到start位置,并在end位置停止录制。 详情参见demo中的实现逻辑
初始化
XYAudioRecorder.init()
开始录制
// audioFilePath表示录音文件路径
XYAudioRecorder.startRecord(audioFilePath);
停止录制
XYAudioRecorder.stopRecord();
获取录制时长
XYAudioRecorder.getRecordDuration()
/**
* 创建新的工程
*/
QEEngineClient.createNewProject(QEWorkSpaceListener)
/**
* 加载工程
*/
QEEngineClient.loadProject(String url, QEWorkSpaceListener qeWorkSpaceListener);
方式一:
/**
* 删除工程
*/
QEEngineClient.deleteProject(String projectPath)
方式二:
/**
* 删除工程
*/
IQEWorkSpace.deleteProject(String projectPath)
工程编辑结束,需要完整释放工程。
/**
* 释放工程缓存
* param needSave 是否需要保存工程
*/
IQEWorkSpace.destory(needSave)
如果只是想临时释放工程注册的各项监听器,则调用:
/**
* 销毁播放器和注册的监听器,播放器监听和操作队列监听
* 当需要重新使用时,需要重新绑定播放器和各种监听器
*/
IQEWorkSpace.unbindUI()
1)在Activity的layout中添加播放器View
<com.quvideo.mobile.engine.player.EditorPlayerView
android:id="@+id/editor_play_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
2)在工程加载成功后,可以绑定工程和播放器
//
// initTime为初始博翻墙需要定位的时间点,默认0即可
mWorkSpace.getPlayerAPI().bindPlayerView(editorPlayerView, initTime);
3)获取播放器控制器
IPlayerController playerController = mWorkSpace.getPlayerAPI().getPlayerController();
IPlayerController 说明:
public interface IPlayerController {
/** 是否播放中 */
boolean isPlaying();
/** 是否暂停 */
boolean isPause();
/** 是否停止 */
boolean isStop();
/** 播放 */
int play();
/** 暂停 */
int pause();
/** 播放或暂停切换 */
int playOrPause();
/** 设置音量 */
int setVolume(int volume);
/** 异步seek到时间点 */
void seek(int time);
/** 异步seek到时间点,playAfterSeek为seek后自动播放 */
void seek(int time, boolean playAfterSeek);
/** 获取当前时间 */
int getCurrentPlayerTime();
/** 获取播放器总时长 */
int getPlayerDuration();
/** 设置播放区域 */
int setPlayRange(int start, int length);
/** 获取播放区域 */
VeRange getPlayerRange();
}
4)注册播放器监听器 注册:
mWorkSpace.getPlayerAPI().registerListener(QEPlayerListener);
注销:
mWorkSpace.getPlayerAPI().unregisterListener(QEPlayerListener);
QEPlayerListener说明:
public interface QEPlayerListener {
enum PlayerStatus {
STATUS_READY,
STATUS_PLAYING,
STATUS_SEEKING,
STATUS_PAUSE,
STATUS_STOP
}
/** 播放器状态回调 */
void onPlayerCallback(PlayerStatus playerStatus, int progress);
/** 播放器刷新 */
void onPlayerRefresh();
/** 播放器尺寸变化 */
void onSizeChanged(Rect resultRect);
}
- 关于PlayerAPI
通过mWorkSpace.getPlayerAPI()可以获取PlayerAPI播放器相关接口
public interface PlayerAPI {
/** 绑定播放器 */
void bindPlayerView(EditorPlayerView editorPlayerView, int initTime);
/** 注册播放器监听 */
void registerListener(QEPlayerListener listener);
/** 注销播放器监听 */
void unregisterListener(QEPlayerListener listener);
/** 获取播放器控制器 */
IPlayerController getPlayerControl();
/** 获取预览区尺寸 */
VeMSize getSurfaceSize();
/** 获取播放器view尺寸 */
VeMSize getPreviewSize();
}
- 关于IQEWorkSpace的其他方法
/**
* 通过偏移时间点拿到关键帧后的位置信息
*
* @param offsetTime 从effect开始的偏移时间
*/
public EffectPosInfo getEffectPosInfoByTime(int groupId, int effectIndex, int offsetTime);
/**
* 通过当前时间拿到关键帧level透明度(指的是overlay subEffect)
*
* @param offsetTime 当前相对时间点
*/
public int getAlphaInfoByTime(int groupId, int effectIndex, int offsetTime);
/**
* 通过当前时间拿到属性关键帧的value值
*
* @param offsetTime 当前相对时间点
*/
public float getAttriInfoByTime(int groupId, int effectIndex, int subType, String attrName, int offsetTime);
/**
* 配置变速时获取相应的src/scale 时间(针对使用了变速的区域)
* bSrc为true时,range应该传入原始时间,返回的是缩放后的时间,
* bSrc为false时,range应该传入缩放后的时间,返回的是原始时间;
*/
public VeRange convertSpeedRange(int clipIndex, VeRange range, boolean isSrc);
/** 获取工程路径 */
mWorkSpace.getProjectUrl();
/** 获取工程目录 */
mWorkSpace.getProjectDir();
/** 获取更多工程信息 */
StoryboardAPI storyboardAPI = mWorkSpace.getStoryboardAPI();
/** 获取片段信息 */
ClipAPI clipAPI = mWorkSpace.getClipAPI();
/** 获取效果信息 */
EffectAPI effectAPI = mWorkSpace.getEffectAPI();
StoryboardAPI信息:
public interface StoryboardAPI {
/** 获取分辨率 */
VeMSize getStreamSize();
/** 获取总时长 */
int getDuration();
/** 获取主题id */
long getThemeId();
/** 获取是否mv主题相册工程 */
boolean isMVProject();
/** 获取主题片头 */
ClipData getCover();
/** 获取主题片尾 */
ClipData getBackCover();
/** 获取主题字幕列表 */
List<ThemeSubtitleEffect> getThemeTitleInfoList();
}
ClipAPI信息:
public interface ClipAPI {
/** 获取所有clip信息 */
List<ClipData> getClipList();
/** 获取指定位置的clip信息 */
ClipData getClipByIndex(int clipIndex);
}
EffectAPI信息:
public interface EffectAPI {
/** 获取所有效果信息并按groupid分组 */
SparseArray<List<BaseEffect>> getAllEffect();
/** 获取groupid的所有效果信息 */
List<BaseEffect> getEffectList(int groupId);
/** 根据groupId和effectIndex所有获取效果信息 */
BaseEffect getEffect(int groupId, int effectIndex);
}
备注:由于StoryboardAPI、ClipAPI和EffectAPI返回的数据都是clone数据,所有直接对返回的数据修改,是不起作用的。
public class QEGroupConst {
/** 背景音乐 */
public static final int GROUP_ID_BGMUSIC = 1;
/** 音效 */
public static final int GROUP_ID_DUBBING = 4;
/** 录音 **/
public static final int GROUP_ID_RECORD = 11;
/** 字幕 */
public static final int GROUP_ID_SUBTITLE = 3;
/** 特效, 和特效滤镜不同 */
public static final int GROUP_ID_STICKER_FX = 6;
/** 贴纸 */
public static final int GROUP_ID_STICKER = 8;
/** 画中画 */
public static final int GROUP_ID_COLLAGES = 20;
/** 马赛克 */
public static final int GROUP_ID_MOSAIC = 40;
/** 自定义水印 */
public static final int GROUP_ID_WATERMARK = 50;
}
- 片段Clip相关 ClipData参数说明:
名称 | 解释 | 类型 |
---|---|---|
uniqueId | clip的唯一识别码 | String |
mType | 类型{@see ClipData.ClipType} | ClipType |
mClipFilePath | 片段文件路径 | String |
isVideo | 是否视频 | boolean |
srcRange | 源文件区间 | VeRange |
trimRange | 片段裁切区间 | VeRange |
destRange | 片段出入区间 | VeRange |
cropRect | 裁剪区域(万分比区域) | Rect |
sourceSize | 源视频宽高,相对streamSize的尺寸 | VeMSize |
rotateAngle | 旋转角度 | int |
isMute | 是否静音 | boolean |
audioVolume | 音量,默认100 | int |
soundTone | 变声,-60~60,正常0。{@see QEDftSoundTone}类中有提供的特定音调 | float |
timeScale | 变速值,默认1.0f | float |
isKeepTone | 是否变速不变调,默认true。false时,设置变速会对音调产生影响 | boolean |
mirror | 镜像{@see ClipData.Mirror} | Mirror |
bReversed | 是否倒放 | boolean |
isPicAnimOn | 是否开启图片动画,只允许对图片clip设置 | boolean |
crossInfo | 转场,null表示无。当前片段和下一个片段的转场数据{@see CrossInfo} | CrossInfo |
filterInfo | 滤镜信息 | FilterInfo |
fxFilterInfo | 特效滤镜信息,null表示无{@see FxFilterInfo} | FxFilterInfo |
mParamAdjust | 参数调节信息{@see ParamAdjust} | ParamAdjust |
mClipPosInfo | 片段位置信息{@see ClipPosInfo} | ClipPosInfo |
mClipBgData | 片段背景信息{@see ClipBgData} | ClipBgData |
mColorCurveInfo | 曲线调色信息数据 {@see ColorCurveInfo} | ColorCurveInfo |
ClipData.ClipType参数说明:
名称 | 解释 |
---|---|
NORMAL | 正常clip |
THEME_COVER | 主题片头 |
THEME_BACKCOVER | 主题片尾 |
ClipData.Mirror参数说明:
名称 | 解释 |
---|---|
CLIP_FLIP_NONE | 正常 |
CLIP_FLIP_X | 沿X方向镜像 |
CLIP_FLIP_Y | 沿Y方向镜像 |
CLIP_FLIP_XY | 沿XY方向镜像 |
CrossInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
crossPath | 转场路径 | String |
duration | 转场时长 | int |
cfgIndex | 转场效果样式,有些素材包含多种效果,表示使用第几个效果,默认0 | int |
FilterInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
filterPath | 滤镜路径 | String |
filterLevel | 滤镜程度,0~100 | int |
externalSource | 滤镜外部图片源数据,依赖模板支持(如3D LUT滤镜模板) | String |
FxFilterInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
filterPath | 特效滤镜路径 | String |
ParamAdjust参数说明:
名称 | 解释 | 类型 |
---|---|---|
brightness | 亮度,0~100,默认50 | int |
contrast | 对比度,0~100,默认50 | int |
sharpness | 锐度,0~100,默认50 | int |
saturation | 饱和度,0~100,默认50 | int |
temperature | 色温,0~100,默认50 | int |
vignette | 暗角,0~100,默认50 | int |
hue | 色相,0~100,默认50 | int |
fade | 褪色,0~100,默认0 | int |
shadow | 阴影,0~100,默认50 | int |
highlight | 高光,0~100,默认50 | int |
noise | 颗粒,0~100,默认0 | int |
ClipPosInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
centerPosX | 中心点-X,在streamSize的坐标系中 | int |
centerPosY | 中心点-Y,在streamSize的坐标系中 | int |
widthScale | 宽放大倍数,默认1 | float |
heightScale | 高放大倍数,默认1 | float |
degree | 旋转角度,0~359度 | float |
ClipBgData参数说明:
名称 | 解释 | 类型 |
---|---|---|
clipBgType | 背景类型 | ClipBgType |
colorArray | color,最多可以支持三色渐变 | int[] |
colorAngle | 颜色渐变角度:默认0-水平方向。0~360 | int |
blurLen | 模糊程度:0~100 | int |
imagePath | 图片背景,自定义图片背景使用 | String |
ClipBgData.ClipBgType参数说明:
名称 | 解释 |
---|---|
BLUR | 模糊背景 |
COLOR | 纯色背景 |
PICTURE | 图片背景 |
ColorCurveInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
mColorCurveItems | 曲线调色详情{@see ColorCurveItem} | ColorCurveItem |
ColorCurveItem参数说明:
名称 | 解释 | 类型 |
---|---|---|
ts | 曲线调色点的相对时间 | int |
rgb | 曲线调色rgb信息点数据 | QPoint |
red | 曲线调色red信息点数据 | QPoint |
green | 曲线调色green信息点数据 | QPoint |
blue | 曲线调色blue信息点数据 | QPoint |
注意: 1.曲线调色信息列表,每个ColorCurveItem需要按ts排序,如果不需要渐变,则只需要一个ColorCurveItem即可。 2.rgb/red/green/blue信息列表,QPoint的x、y取值范围都是0~255。需按x的从小到大排序,且至少需要保证有x=0和x=255的两个点。
- 效果Effect相关 效果类继承结构:
BaseEffect参数说明:
名称 | 解释 | 类型 |
---|---|---|
uniqueId | effect的唯一识别码 | String |
groupId | 效果Group分类id | int |
mEffectPath | 效果素材文件路径 | String |
isApplyByTheme | 是否主题添加 | boolean |
srcRange | 源文件区间 | VeRange |
trimRange | 效果裁切区间 | VeRange |
destRange | 效果出入区间 | VeRange |
effectLayerId | 效果图层id,数字越大 层级越高 | float |
isHadAudio | 效果是否带有音频数据 | boolean |
audioVolume | 音量 | int |
AudioEffect参数说明:
名称 | 解释 | 类型 |
---|---|---|
mAudioInfo | 音频数据信息 {@see EffectAudioInfo} | EffectAudioInfo |
EffectAudioInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
isRepeat | 是否循环,默认开始 | boolean |
soundTone | 变声,-60~60,正常0。{@see QEDftSoundTone}类中有提供的特定音调 | float |
audioFadeIn | 渐入,只对背景音乐有效 {@see AudioFade} | AudioFade |
audioFadeOut | 渐出,只对背景音乐有效 {@see AudioFade} | AudioFade |
audioLyric | 歌曲字幕信息 {@see AudioLyric} | AudioLyric |
musicMsg | 音乐信息,开发者可以用于存储音乐相关的信息 | String |
AudioFade参数说明:
名称 | 解释 | 类型 |
---|---|---|
type | 渐入渐入类型 {@see AudioFade.Type} | AudioFade.Type |
duration | 渐变时长,0则无效果 | int |
AudioFade.Type参数说明:
名称 | 解释 |
---|---|
FadeIn | 渐入 |
FadeOut | 渐出 |
AudioLyric参数说明:
名称 | 解释 | 类型 |
---|---|---|
lyricPath | 歌曲字幕lyric文件路径 | string |
lyricTtid | 歌词模板的素材id | long |
FloatEffect参数说明:
名称 | 解释 | 类型 |
---|---|---|
alpha | 透明度 0~100 | int |
mMirror | 镜像信息 {@see FloatEffect.Mirror} | Mirror |
mEffectPosInfo | 效果位置数据信息 {@see EffectPosInfo} | EffectPosInfo |
FloatEffect.Mirror参数说明:
名称 | 解释 |
---|---|
EFFECT_FLIP_NONE | 正常 |
EFFECT_FLIP_X | 沿X方向镜像 |
EFFECT_FLIP_Y | 沿Y方向镜像 |
EFFECT_FLIP_XY | 沿XY方向镜像 |
EffectPosInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
center | 中心点,实际为锚点坐标,{@see Ve3DDataF} 只是默认在中心点,(0,0,0)为效果以streamsize的中心点,x/y左上角为0,右下角为1,z为屏幕上为0,向屏幕里为正,向屏幕外为负 | Ve3DDataF |
size | 尺寸,(0,0,0)为效果以streamsize的宽高深 | Ve3DDataF |
degree | 旋转角度,(0,0,0)为效果以x/y/z轴的旋转角度 。取值范围是 0~360 | Ve3DDataF |
anchorOffset | 锚点相对中心点的偏移,默认(0,0,0) | Ve3DDataF |
Ve3DDataF参数说明:
名称 | 解释 | 类型 |
---|---|---|
x | x轴方向信息 | float |
y | y轴方向信息 | float |
z | z轴方向信息 | float |
AnimEffect参数说明:
名称 | 解释 | 类型 |
---|---|---|
mEffectOverlayInfo | 混合模式信息数据 {@see EffectOverlayInfo} | EffectOverlayInfo |
mEffectMaskInfo | 蒙版位置信息数据 {@see EffectMaskInfo} | EffectMaskInfo |
mEffectChromaInfo | 抠色信息数据(绿幕) {@see EffectChromaInfo} | EffectChromaInfo |
mFilterInfo | 滤镜信息数据 {@see FilterInfo} | FilterInfo |
mParamAdjust | 参数调节信息数据 {@see ParamAdjust} | ParamAdjust |
mColorCurveInfo | 曲线调色信息数据 {@see ColorCurveInfo} | ColorCurveInfo |
mEffectSubFxList | 子特效列表信息数据 {@see EffectSubFx} | EffectSubFx |
mEffectKeyFrameInfo | 关键帧信息数据 {@see EffectKeyFrameInfo}(由于功能复杂,后期可能调整数据结构) | EffectKeyFrameInfo |
EffectOverlayInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
overlayPath | 混合模式素材路径 | String |
level | 混合程度,改参数和透明度一个效果,0~100 | int |
EffectMaskInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
maskType | 蒙版类型{@see EffectMaskInfo.MaskType} | MaskType |
centerX | 中心点-X,中心点尽量保持在素材位置内。相对画中画的万分比坐标(字幕比较特殊,需要相对streamsize的万分比坐标) | float |
centerY | 中心点-Y,中心点尽量保持在素材位置内。相对画中画的万分比坐标(字幕比较特殊,需要相对streamsize的万分比坐标) | float |
radiusY | 垂直方向半径,相对画中画的万分比坐标(字幕比较特殊,需要相对streamsize的万分比坐标) | float |
radiusX | 水平方向半径,相对画中画的万分比坐标(字幕比较特殊,需要相对streamsize的万分比坐标) | float |
rotation | 旋转角度, 0~360 | float |
softness | 羽化程度,取值范围:[0~10000] | int |
reverse | 是否反选 | boolean |
maskKeyFrameInfo | 蒙版关键帧信息{@see MaskKeyFrameInfo} | MaskKeyFrameInfo |
EffectMaskInfo.MaskType
名称 | 解释 |
---|---|
MASK_NONE | 无蒙版 |
MASK_LINEAR | 线性蒙版 |
MASK_MIRROR | 镜像蒙版 |
MASK_RADIAL | 径向蒙版 |
MASK_RECTANGLE | 矩形蒙版 |
MaskKeyFrameInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
maskPosList | 蒙版位置关键帧信息列表{@see KeyMaskPosInfo} | KeyMaskPosInfo列表 |
rotationList | 旋转角度关键帧信息列表{@see KeyAttributeInfo} | KeyAttributeInfo列表 |
softnessList | 羽化程度关键帧信息列表{@see KeyAttributeInfo} | KeyAttributeInfo列表 |
reverseList | 反选信息关键帧信息列表{@see KeyBAttrInfo} | KeyBAttrInfo列表 |
KeyMaskPosInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
centerX | 中心点-X,中心点尽量保持在素材位置内。相对画中画的万分比坐标(字幕比较特殊,需要相对streamsize的万分比坐标) | float |
centerY | 中心点-Y,中心点尽量保持在素材位置内。相对画中画的万分比坐标(字幕比较特殊,需要相对streamsize的万分比坐标) | float |
radiusY | 垂直方向半径,相对画中画的万分比坐标(字幕比较特殊,需要相对streamsize的万分比坐标) | float |
radiusX | 水平方向半径,相对画中画的万分比坐标(字幕比较特殊,需要相对streamsize的万分比坐标) | float |
KeyBAttrInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
attrValue | 属性关键帧:属性值 | boolean |
EffectChromaInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
enable | 是否开启 | boolean |
color | 抠色的颜色值, 如0xFFFFFF | int |
accuracy | 抠色的精度(0~5000) | int |
EffectSubFx参数说明:
名称 | 解释 | 类型 |
---|---|---|
subFxPath | 子特效素材路径 | String |
subType | 子特效索引,不可修改 | 1000~2000 |
destRange | 子特效出入点区间,相对效果的时间 | VeRange |
EffectKeyFrameInfo参数说明:(由于功能复杂,后期可能调整数据结构)
名称 | 解释 | 类型 |
---|---|---|
positionList | 位置关键帧列表 {@see KeyPosInfo} | KeyPosInfo |
scaleList | 缩放关键帧列表 {@see KeyScaleInfo} | KeyScaleInfo |
rotationList | 旋转角度关键帧列表{@see KeyRotationInfo} | KeyRotationInfo |
alphaList | 不透明度关键帧列表{@see KeyAlphaInfo} | KeyAlphaInfo |
BaseKeyFrame参数说明:
名称 | 解释 | 类型 |
---|---|---|
keyFrameType | 关键帧类型 | KeyFrameType |
relativeTime | 相对于效果入点的时间 | int |
isCurvePath | 关键帧是否曲线路径 | boolean |
mKeyBezierCurve | 关键帧缓动贝塞尔曲线点{@see KeyBezierCurve} | KeyBezierCurve |
offsetOpcodeType | 基础偏移操作方式{KEYFRAME_COMMON_OFFSET_TYPE_PLUS相加, KEYFRAME_COMMON_OFFSET_TYPE_MUL相乘} | int |
KeyFrameType参数说明:
名称 | 解释 |
---|---|
Position | 位置关键帧 |
AnchorOffset | 锚点位移关键帧 |
Scale | 缩放关键帧 |
Rotation | 旋转关键帧 |
Alpha | 透明度关键帧 |
Mask | 蒙版关键帧,暂不支持 |
Attribute | 属性关键帧,暂不支持 |
KeyBezierCurve参数说明:
名称 | 解释 | 类型 |
---|---|---|
start | 贝塞尔缓动曲线起点,需固定( 0,0) | QPoint |
stop | 贝塞尔缓动曲线终点,需固定( 10000,10000) | QPoint |
c0 | 贝塞尔缓动节点1 | QPoint |
c1 | 贝塞尔缓动节点2 | QPoint |
KeyPosInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
center | 位置信息,在streamSize的坐标系中{@see Ve3DDataF} | Ve3DDataF |
baseOffset | 位置偏移,相对center再做一个偏移{@see Ve3DDataF} | Ve3DDataF |
KeyAnchorOffset参数说明:
名称 | 解释 | 类型 |
---|---|---|
anchorOffset | 锚点位置偏移信息,在streamSize的坐标系中{@see Ve3DDataF} | Ve3DDataF |
baseOffset | 锚点偏移,相对anchorOffset再做一个偏移{@see Ve3DDataF} | Ve3DDataF |
KeyScaleInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
scale | 缩放信息 {@see Ve3DDataF} | Ve3DDataF |
baseOffset | 缩放倍数偏移,相对scale再做一个乘积偏移{@see Ve3DDataF} | Ve3DDataF |
KeyRotationInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
rotation | 角度信息 {@see Ve3DDataF} | Ve3DDataF |
baseOffset | 角度偏移,相对rotation再做一个角度偏移{@see Ve3DDataF} | Ve3DDataF |
KeyAlphaInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
alpha | 不透明度 0~100 | int |
CollageEffect参数说明:
名称 | 解释 | 类型 |
---|---|---|
timeScale | 变速值,默认1.0f | float |
isVideoReverse | 是否倒放视频源,视频&音频可分开倒放 | boolean |
isAudioReverse | 是否倒放音频源,视频&音频可分开倒放 | boolean |
MosaicEffect参数说明:
名称 | 解释 | 类型 |
---|---|---|
mosaicInfo | 马赛克模糊程度数据信息 {@see MosaicInfo} | MosaicInfo |
MosaicInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
horValue | 水平模糊程度 | int |
verValue | 垂直模糊程度 | int |
SubtitleEffect参数说明:
名称 | 解释 | 类型 |
---|---|---|
textBubbleInfo | 字幕数据信息 {@see TextBubbleInfo} | TextBubbleInfo |
TextBubbleInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
bSupportAnim | 是否支持动画 | boolean |
isAnimOn | 是否开启字幕动画 | boolean |
isDftTemplate | 是否默认字幕 | boolean |
dftDuration | 字幕默认时长 | int |
mTextBubbleList | 字幕数据信息 {@see TextBubble} | List(TextBubble) |
TextBubble参数说明:
名称 | 解释 | 类型 |
---|---|---|
bSupportAnim | 是否支持动画 | boolean |
isAnimOn | 是否开启字幕动画 | boolean |
isDftTemplate | 是否默认字幕 | boolean |
mDftText | 默认文字 | String |
mTextColor | 颜色,如0xFFFFFFFF,即ARGB | int |
mText | 文字 | String |
mTextAlignment | 对齐方式,在{@class TextBuble} 中定义,可以进行 ' | ' 位运算合并。 |
mFontPath | 字体文件路径 | String |
mDftTextColor | 默认颜色,如0xFFFFFFFF,即ARGB | int |
mShadowInfo | 字幕阴影信息 {@see ShadowInfo} | ShadowInfo |
mStrokeInfo | 字幕描边信息 {@see StrokeInfo} | StrokeInfo |
isBold | 是否粗体 | boolean |
isItalic | 是否斜体 | boolean |
ShadowInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
enable | 是否开启阴影 | boolean |
shadowXShift | 横向阴影偏移,百分比小数值,0表示无偏移,0~1,不可小于0 | float |
shadowYShift | 垂直阴影偏移,百分比小数值,0表示无偏移,0~1,不可小于0 | float |
shadowColor | 阴影颜色,如0xAA000000,即ARGB | int |
shadowBlurRadius | 阴影宽度,百分比小数值,0表示无阴影,0~1,不可小于0 | float |
StrokeInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
strokeWPersent | 描边,百分比小数值,0表示无描边,1表示描边宽度和文字高度相同,不可小于0 | float |
strokeColor | 描边的颜色,如0xFFFFFFFF,即ARGB | int |
由于剪辑操作都是在线程中异步进行的,所以操作结束后,如果需要获取成功失败信息。可以向工程注册剪辑操作监听器。
/** 注册操作符监听器 */
mWorkSpace.addObserver(BaseObserver);
不再需要监听时,可以取消监听:
/** 注销操作符监听器 */
mWorkSpace.removeObserver(BaseObserver);
BaseObserver说明:
public interface BaseObserver {
void onChange(BaseOperate operate);
}
BaseOperate说明:
// 是否操作成功
operate.success();
// 是否操作结束保存工程当前状态(保存为线程操作,但备份工程需要耗时,请尽量避免不必要的过多保存操作)
setNeedSavePrj(isNeedSavePrj);
1)应用/切换主题
// themePath表示主题素材路径
ThemeOPApply themeOPApply = new ThemeOPApply(themePath);
mWorkSpace.handleOperation(themeOPApply);
2)恢复主题背景音乐设置
// 该操作将删除所以背景应用,切回主题自带的背景音乐
ThemeOPBgmReset themeOPBgmReset = new ThemeOPBgmReset();
mWorkSpace.handleOperation(themeOPBgmReset);
3)修改主题关联字幕文本
// themeSubtitleEffect表示需要修改的主题字幕,是通过工程获取到的信息 {@see ThemeSubtitleEffect}
// text表示修改的文本信息
ThemeOPSubtitleText themeOPSubtitleText = new ThemeOPSubtitleText(themeSubtitleEffect, text);
mWorkSpace.handleOperation(themeOPSubtitleText);
ThemeSubtitleEffect参数说明:
名称 | 解释 | 类型 | 是否必须 |
---|---|---|---|
mGroupType | 字幕类型 | GroupType | 必须 |
mIndex | 字幕在类型中的排序位置 | int | 必须 |
destRange | 切入切出区间 | VeRange | 必须 |
mText | 字幕文本 | String | 必须 |
effectPosInfo | 字幕位置信息 | EffectPosInfo | 必须 |
1)添加
ArrayList<ClipAddItem> list;
// clipIndex为clip添加的位置,0为第一个
// list需要添加的clip列表
ClipOPAdd clipOPAdd = new ClipOPAdd(clipIndex, list);
mWorkSpace.handleOperation(clipOPAdd);
ClipAddItem参数说明:
名称 | 解释 | 类型 | 是否必须 |
---|---|---|---|
clipFilePath | 文件地址 | String | 必须 |
trimRange | 切入点 | VeRange | 非必须 |
srcRange | 源视频文件区间, 仅用于保存 | VeRange | 非必须 |
cropRect | 裁切区域(万分比区域) | Rect | 非必须 |
rotateAngle | 旋转角度 | int | 非必须 |
filterInfo | 滤镜 | FilterInfo | 非必须 |
2)复制
// clipIndex表示第几个片段,从0开始
ClipOPCopy clipOPCopy = new ClipOPCopy(clipIndex);
mWorkSpace.handleOperation(clipOPCopy);
3)删除
方式一:
// clipIndex表示第几个片段,从0开始
ClipOPDel clipOPDel = new ClipOPDel(clipIndex);
mWorkSpace.handleOperation(clipOPDel);
方式二:
// uniqueId为ClipData中的片段唯一id
ClipOPDel clipOPDel = new ClipOPDel(uniqueId);
mWorkSpace.handleOperation(clipOPDel);
4)排序
// 将位置clipIndex的片段移动到toIndex的位置
ClipOPMove clipOPMove = new ClipOPMove(clipIndex, toIndex);
mWorkSpace.handleOperation(clipOPMove);
5)静音
// clipIndex表示第几个片段,从0开始
// isMute是否静音
ClipOPMute clipOPMute = new ClipOPMute(clipIndex, isMute);
mWorkSpace.handleOperation(clipOPMute);
6)音量
// clipIndex表示第几个片段,从0开始
// volume表示音量,100为正常音量,200为放大1倍
ClipOPVolume clipOPVolume = new ClipOPVolume(clipIndex, volume);
mWorkSpace.handleOperation(clipOPVolume);
7)变声
// clipIndex表示第几个片段,从0开始
// soundTone表示音调,从-60~60,{@see QEDftSoundTone}类中有提供的特定音调
ClipOPMagicSound clipOPMagicSound = new ClipOPMagicSound(clipIndex, soundTone);
mWorkSpace.handleOperation(clipOPMagicSound);
8)镜像
// clipIndex表示第几个片段,从0开始
// mirror表示镜像类型 {@see ClipData.Mirror}
ClipOPMirror clipOPMirror = new ClipOPMirror(clipIndex, mirror);
mWorkSpace.handleOperation(clipOPMirror);
9)旋转
// clipIndex表示第几个片段,从0开始
// rotation旋转角度 0~359度
ClipOPRotate clipOPRotate = new ClipOPRotate(clipIndex, rotation);
mWorkSpace.handleOperation(clipOPRotate);
10)分割
// clipIndex表示第几个片段,从0开始
// splitTime分割时间,在加入片段的相对时间(是相对trimRange,不是相对原视频),如从片段的第5s分割,则splitTime=5000
ClipOPSplit clipOPSplit = new ClipOPSplit(clipIndex, splitTime);
mWorkSpace.handleOperation(clipOPSplit);
11)变速
// clipIndex表示第几个片段,从0开始
// speedValue变速缩放值。如0.25表示4倍速。保留两位小数
// isKeepTone表示变速是否需要变调
ClipOPSpeed clipOPSpeed = new ClipOPSpeed(clipIndex, speedValue, isKeepTone);
mWorkSpace.handleOperation(clipOPSpeed);
12)倒放
// clipIndex表示第几个片段,从0开始
// toReverse是否倒放
ClipOPReverse clipOPReverse = new ClipOPReverse(clipIndex, toReverse);
mWorkSpace.handleOperation(clipOPReverse);
13)比例
// size 比例,只需要宽高比即可
// isRatioOriginal 是否原比例。用于添加clip时是否需要重新适配分辨率
ClipOPRatio clipOPRatio = new ClipOPRatio(size, isRatioOriginal);
mWorkSpace.handleOperation(clipOPRatio);
14)裁切
// clipIndex表示第几个片段,从0开始
// cropRect表示裁切区域(万分比区域)
ClipOPCrop clipOPCrop = new ClipOPCrop(clipIndex, cropRect);
mWorkSpace.handleOperation(clipOPCrop);
15)视频裁剪
// clipIndex表示第几个片段,从0开始
// trimRange裁剪区域(trimRange需要设置为源视频的区域 * clip的timeScale,比如从原视频的5~20s,则trimRange为new VeRange(5*timescale, 15*timescale))
ClipOPTrimRange clipOPTrimRange = new ClipOPTrimRange(clipIndex, trimRange);
mWorkSpace.handleOperation(clipOPTrimRange);
16)视频源区间
// clipIndex表示第几个片段,从0开始
// srcRange裁剪区域(srcRange表示从视频源文件选择的区间,目前数据只是存储)
ClipOPSrcRange clipOPSrcRange = new ClipOPSrcRange(clipIndex, srcRange裁剪区域);
mWorkSpace.handleOperation(clipOPSrcRange);
17)图片时长
// clipIndex表示第几个片段,从0开始
// duration图片时长
ClipOPPicTrim clipOPPicTrim = new ClipOPPicTrim(clipIndex, duration);
mWorkSpace.handleOperation(clipOPPicTrim);
18)图片动画
// clipIndex表示第几个片段,从0开始
// isAnimEnable是否开启图片动画
ClipOPPicAnim clipOPPicAnim = new ClipOPPicAnim(clipIndex, isAnimEnable);
mWorkSpace.handleOperation(clipOPPicAnim);
19)背景
// clipIndex表示第几个片段,从0开始
// clipBgData背景数据 {@see ClipBgData}
ClipOPBackground clipOPBackground = new ClipOPBackground(clipIndex, clipBgData);
mWorkSpace.handleOperation(clipOPBackground);
ClipBgData构造器
/**
* 模糊背景
*/
public ClipBgData(int blurLen);
/**
* 图片背景
*/
public ClipBgData(String imagePath, int blurLen);
/**
* 颜色背景
*
* @param colorAngle colorArray最多支持三色。渐变色 0-1-2
* @param colorAngle 渐变色方向。默认为水平方向,取值范围:0~360,对应的角度:0~360,单位为°
*/
public ClipBgData(int[] colorArray, int colorAngle);
20)位置修改
// 方式一:
// clipIndex表示第几个片段,从0开始
// clipPosInfo镜头位置数据 {@see ClipPosInfo}
ClipOPPosInfo clipOPPosInfo = new ClipOPPosInfo(clipIndex, clipPosInfo);
mWorkSpace.handleOperation(clipOPPosInfo);
// 方式二:
// clipIndex表示第几个片段,从0开始
// isFitOut镜头位置是否自适应裁切(true:裁切 false:自适应。对应imageview的scaleType的fitCenter和centerCrop)
ClipOPPosInfo clipOPPosInfo = new ClipOPPosInfo(clipIndex, isFitOut);
mWorkSpace.handleOperation(clipOPPosInfo);
21)镜头参数调节
// clipIndex表示第几个片段,从0开始
// paramAdjust镜头参数调节数据 {@see ParamAdjust}
ClipOPParamAdjust clipOPParamAdjust = new ClipOPParamAdjust(clipIndex, paramAdjust);
mWorkSpace.handleOperation(clipOPParamAdjust);
22)曲线调色调节
// clipIndex表示第几个片段,从0开始
// colorCurveInfo曲线调色数据 {@see ColorCurveInfo}
ClipOPColorCurve clipOPColorCurve = new ClipOPColorCurve(clipIndex, colorCurveInfo);
mWorkSpace.handleOperation(clipOPColorCurve);
23)修改滤镜
// clipIndex表示第几个片段,从0开始
// filterInfo滤镜信息,null表示无滤镜
ClipOPFilter clipOPFilter = new ClipOPFilter(clipIndex, filterInfo);
mWorkSpace.handleOperation(clipOPFilter);
24)特效滤镜
// clipIndex表示第几个片段,从0开始
// fxFilterInfo特效滤镜信息 {@see FxFilterInfo},null表示不使用特效滤镜
ClipOPFxFilter clipOPFxFilter = new ClipOPFxFilter(clipIndex, fxFilterInfo);
mWorkSpace.handleOperation(clipOPFxFilter);
25)转场
// clipIndex表示第几个片段,从0开始
// crossInfo转场信息 {@see CrossInfo},null表示不使用转场
ClipOPTrans clipOPTrans = new ClipOPTrans(clipIndex, crossInfo);
mWorkSpace.handleOperation(clipOPTrans);
26)替换clip
// clipIndex为clip添加的位置,0为第一个
// 替换的数据 clipReplaceItem;
ClipOPReplace clipOPReplace = new ClipOPReplace(clipIndex, clipReplaceItem);
mWorkSpace.handleOperation(clipOPReplace);
ClipReplaceItem:
名称 | 解释 | 类型 | 是否必须 |
---|---|---|---|
clipFilePath | 文件地址 | String | 必须 |
trimRange | 切入点 | VeRange | 非必须 |
srcRange | 源视频文件区间, 仅用于保存 | VeRange | 非必须 |
cropRect(万分比区域) | 裁切区域 | Rect | 非必须 |
1)添加
// groupId为effect的类型
// effectIndex为effect添加的位置,0为第一个
// effectAddItem需要添加的effect信息 {@see EffectAddItem}
EffectOPAdd effectOPAdd = new EffectOPAdd(groupId, effectIndex, effectAddItem);
mWorkSpace.handleOperation(effectOPAdd);
EffectAddItem参数说明:
名称 | 解释 | 类型 | 是否必须 |
---|---|---|---|
mEffectPath | 素材资源路径 | String | 必须 |
trimRange | 效果选取的时长,可以选取某一部分,默认(0, -1) | VeRange | 非必须 |
destRange | effect在storyboard上的 mVeRange(起始点,时长) | VeRange | 非必须 |
effectLayerId | 效果的层级信息,是一个浮点数,数字越大 层级越高 | float | 非必须 |
mEffectPosInfo | 素材位置数据,基于steamsize的,使用的话EffectPosInfo有关于surfacesize的转化 | EffectPosInfo | 非必须 |
subtitleTexts | 字幕时,可以设置字幕的文字 | String | 非必须 |
2)复制
// groupId为effect的类型
// effectIndex为同类型中第几个效果
EffectOPCopy effectOPCopy = new EffectOPCopy(groupId, effectIndex);
mWorkSpace.handleOperation(effectOPCopy);
3)删除 方式一:
// groupId为effect的类型
// effectIndex为同类型中第几个效果
EffectOPDel effectOPDel = new EffectOPDel(groupId, effectIndex);
mWorkSpace.handleOperation(effectOPDel);
方式二:
// uniqueId为effect的唯一id {@see BaseEffect.uniqueId}
EffectOPDel effectOPDel = new EffectOPDel(uniqueId);
mWorkSpace.handleOperation(effectOPDel);
4)修改图层
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// layerId表示图层,float类型,各类型的图层有区间限制
EffectOPLayerId effectOPLayerId = new EffectOPLayerId(groupId, effectIndex, layerId);
mWorkSpace.handleOperation(effectOPLayerId);
5)裁切区间
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// trimRange表示裁切区间
EffectOPTrimRange effectOPTrimRange = new EffectOPTrimRange(groupId, effectIndex, trimRange);
mWorkSpace.handleOperation(effectOPTrimRange);
6)出入区间
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// destRange表示切入切出区间
EffectOPDestRange effectOPDestRange = new EffectOPDestRange(groupId, effectIndex, destRange);
mWorkSpace.handleOperation(effectOPDestRange);
7)源文件区间
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// srcRange表示源文件区间信息
EffectOPSrcRange effectOPSrcRange = new EffectOPSrcRange(groupId, effectIndex, srcRange);
mWorkSpace.handleOperation(effectOPSrcRange);
8)透明度
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// alpha表示透明度,0~100
EffectOPAlpha effectOPAlpha = new EffectOPAlpha(groupId, effectIndex, alpha);
mWorkSpace.handleOperation(effectOPAlpha);
9)音量
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// volume表示音量,100为正常音量,200为放大1倍
EffectOPVolume effectOPVolume = new EffectOPVolume(groupId, effectIndex, volume);
mWorkSpace.handleOperation(effectOPVolume);
10)音频渐入渐出
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// audioFade表示渐入渐出信息 {@see AudioFade}
EffectOPAudioFade effectOPAudioFade = new EffectOPAudioFade(groupId, effectIndex, audioFade);
mWorkSpace.handleOperation(effectOPAudioFade);
11)音频循环
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// isRepeat表示在切入切成区域是否循环播放
EffectOPAudioRepeat effectOPAudioRepeat = new EffectOPAudioRepeat(groupId, effectIndex, isRepeat);
mWorkSpace.handleOperation(effectOPAudioRepeat);
12)音频变声
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// soundTone表示音调,从-60~60,{@see QEDftSoundTone}类中有提供的特定音调
EffectOPAudioTone effectOPAudioTone = new EffectOPAudioTone(groupId, effectIndex, soundTone);
mWorkSpace.handleOperation(effectOPAudioTone);
13)音频歌词字幕设置
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// audioLyric表示引擎歌词字幕信息 {@see AudioLyric}
EffectOPAudioLyric effectOPAudioLyric = new EffectOPAudioLyric(groupId, effectIndex, audioLyric);
mWorkSpace.handleOperation(effectOPAudioLyric);
14)音频信息
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// message表示音频信息,如可以保存歌手、歌名等。
EffectOPAudioMsg effectOPAudioMsg = new EffectOPAudioMsg(groupId, effectIndex, message);
mWorkSpace.handleOperation(effectOPAudioMsg);
15)锁定播放器刷新效果
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// isLock表示是否锁定
EffectOPLock effectOPLock = new EffectOPLock(groupId, effectIndex, isLock);
mWorkSpace.handleOperation(effectOPLock);
该操作配合EffectOPPosInfo使用,当需要快速刷新播放器某个效果位置时,需要先锁定该效果,当位置刷新结束后,需要对改效果解锁。
16)位置信息
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// effectPosInfo表示位置信息 {@see EffectPosInfo}
EffectOPPosInfo effectOPPosInfo = new EffectOPPosInfo(groupId, effectIndex, effectPosInfo);
mWorkSpace.handleOperation(effectOPPosInfo);
备注:EffectOPPosInfo可以设置是否快速刷新,只有在操作前设置才起作用
effectOPPosInfo.setFastRefresh(fastRefresh);
快速刷新用于快速刷新播放器,提高播放器刷新性能使用,不会保存到工程中,所以快速刷新操作结束后,需要再进行一次非快速刷新的修改,才能真实起作用。需要结合EffectOPLock操作使用,锁定播放器中的素材刷新。
17)镜像修改
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// mirror表示镜像数据 {@see FloatEffect.Mirror}
EffectOPMirror effectOPMirror = new EffectOPMirror(groupId, effectIndex, mirror);
mWorkSpace.handleOperation(effectOPMirror);
18)画中画变速
// 目前只支持画中画
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// speedValue变速缩放值。如0.25表示4倍速。保留两位小数
EffectOPCollageSpeed effectOPCollageSpeed = new EffectOPCollageSpeed(groupId, effectIndex, speedValue);
mWorkSpace.handleOperation(effectOPCollageSpeed);
19)画中画倒放
// 目前只支持画中画
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// isVideoReverse表示是否倒放视频源
// isAudioReverse表示是否倒放音频源
EffectOPCollageReserve effectOPCollageReserve = new EffectOPCollageReserve(groupId, effectIndex, isVideoReverse, isAudioReverse);
mWorkSpace.handleOperation(effectOPCollageReserve);
20)替换音频
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// audioPath表示音频路径
// srcRange表示引擎裁切区间
EffectOPAudioReplace effectOPAudioReplace = new EffectOPAudioReplace(groupId, effectIndex, audioPath, srcRange);
mWorkSpace.handleOperation(effectOPAudioReplace);
21)替换效果素材文件
// groupId为effect的类型
// effectIndex为effect添加的位置,0为第一个
// effectReplaceItem需要替换的effect信息 {@see EffectReplaceItem}
EffectOPReplace effectOPReplace = new EffectOPReplace(groupId, effectIndex, effectReplaceItem);
mWorkSpace.handleOperation(effectOPReplace);
EffectReplaceItem参数说明:
名称 | 解释 | 类型 | 是否必须 |
---|---|---|---|
mEffectPath | 素材资源路径 | String | 必须 |
trimRange | null时则不修改原来的trimRange | VeRange | 非必须 |
destRange | null时则不修改原来的destRange | VeRange | 非必须 |
mEffectPosInfo | null则根据原有的effectPosInfo进行简单的缩放处理 | EffectPosInfo | 非必须 |
22)画中画混合模式设置
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// effectOverlayInfo表示混合模式信息 {@see EffectOverlayInfo}
EffectOPOverlayInfo effectOPOverlayInfo = new EffectOPOverlayInfo(groupId, effectIndex, effectOverlayInfo);
mWorkSpace.handleOperation(effectOPOverlayInfo);
23)画中画蒙版设置
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// effectMaskInfo表示蒙版信息 {@see EffectMaskInfo}
EffectOPMaskInfo effectOPMaskInfo = new EffectOPMaskInfo(groupId, effectIndex, effectMaskInfo);
mWorkSpace.handleOperation(effectMaskInfo);
24)画中画抠色设置(绿幕)
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// chromaInfo表示抠色信息 {@see EffectChromaInfo}
EffectOPChroma effectOPChroma = new EffectOPChroma(groupId, effectIndex, chromaInfo);
mWorkSpace.handleOperation(effectOPChroma);
25)画中画滤镜设置
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// FilterInfo表示滤镜信息 {@see FilterInfo}
EffectOPFilterInfo effectOPFilterInfo = new EffectOPFilterInfo(groupId, effectIndex, filterInfo);
mWorkSpace.handleOperation(effectOPFilterInfo);
26)画中画参数调节设置
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// paramAdjust表示参数调节信息 {@see ParamAdjust}
EffectOPParamAdjust effectOPParamAdjust = new EffectOPParamAdjust(groupId, effectIndex, paramAdjust);
mWorkSpace.handleOperation(effectOPParamAdjust);
27)画中画曲线调色设置
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// colorCurveInfo表示曲线调色信息 {@see ColorCurveInfo}
EffectOPColorCurve effectOPColorCurve = new EffectOPColorCurve(groupId, effectIndex, colorCurveInfo);
mWorkSpace.handleOperation(effectOPColorCurve);
28)画中画添加子特效
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// subFxPath表示特效素材路径
// destRange表示特效出入相对时间区间
EffectOPSubFxAdd effectOPSubFxAdd = new EffectOPSubFxAdd(groupId, effectIndex, subFxPath, destRange);
mWorkSpace.handleOperation(effectOPSubFxAdd);
29)画中画修改子特效出入点时间区间
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// subType表示子特效索引{@see EffectSubFx}
// destRange表示特效出入相对时间区间
EffectOPSubFxDestRange effectOPSubFxDestRange = new EffectOPSubFxDestRange(groupId, effectIndex, subType, destRange);
mWorkSpace.handleOperation(effectOPSubFxDestRange);
30)画中画修改子特效是否关闭
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// subType表示子特效索引{@see EffectSubFx}
// disable表示特效效果是否关闭
EffectOPSubFxDisable effectOPSubFxDisable = new EffectOPSubFxDisable(groupId, effectIndex, subType, disable);
mWorkSpace.handleOperation(effectOPSubFxDisable);
31)画中画删除子特效
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// subType表示子特效索引{@see EffectSubFx}
EffectOPSubFxDel effectOPSubFxDel = new EffectOPSubFxDel(groupId, effectIndex, subType);
mWorkSpace.handleOperation(effectOPSubFxDel);
32)显示静态图片
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// showStaticPic表示是否显示静态图片
EffectOPStaticPic effectOPStaticPic = new EffectOPStaticPic(groupId, effectIndex, showStaticPic);
mWorkSpace.handleOperation(effectOPStaticPic);
备注:由于一些动态贴纸/字幕,有效果变化,可以通过该操作,使效果关闭动画显示固定效果。
33)马赛克模糊程度
// groupId默认为GROUP_ID_MOSAIC
// effectIndex为同类型中第几个效果
// mosaicInfo表示马赛克模糊程度 {@see MosaicInfo}
EffectOPMosaicInfo effectOPMosaicInfo = new EffectOPMosaicInfo(effectIndex, mosaicInfo);
mWorkSpace.handleOperation(effectOPMosaicInfo);
34)字幕动画开关
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// animOn表示是否开启动画
EffectOPSubtitleAnim effectOPSubtitleAnim = new EffectOPSubtitleAnim(effectIndex, animOn);
mWorkSpace.handleOperation(effectOPSubtitleAnim);
35)字幕文本 单字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// text表示字幕文本
EffectOPSubtitleText effectOPSubtitleText = new EffectOPSubtitleText(effectIndex, text);
mWorkSpace.handleOperation(effectOPSubtitleText);
组合字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// textIndex表示组合字幕中的第几个字幕
// text表示字幕文本
EffectOPMultiSubtitleText effectOPMultiSubtitleText = new EffectOPMultiSubtitleText(effectIndex, textIndex, text);
mWorkSpace.handleOperation(effectOPMultiSubtitleText);
36)字幕字体 单字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// fontPath表示字体文件路径
EffectOPSubtitleFont effectOPSubtitleFont = new EffectOPSubtitleFont(effectIndex, fontPath);
mWorkSpace.handleOperation(effectOPSubtitleFont);
组合字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// textIndex表示组合字幕中的第几个字幕
// fontPath表示字体文件路径
EffectOPMultiSubtitleFont effectOPMultiSubtitleFont = new EffectOPMultiSubtitleFont(effectIndex, textIndex, fontPath);
mWorkSpace.handleOperation(effectOPMultiSubtitleFont);
37)字幕文本颜色 单字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// color表示文本颜色,如0xFFFFFFFF,即ARGB
EffectOPSubtitleColor effectOPSubtitleColor = new EffectOPSubtitleColor(effectIndex, color);
mWorkSpace.handleOperation(effectOPSubtitleColor);
组合字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// textIndex表示组合字幕中的第几个字幕
// color表示文本颜色,如0xFFFFFFFF,即ARGB
EffectOPMultiSubtitleColor effectOPMultiSubtitleColor = new EffectOPMultiSubtitleColor(effectIndex, textIndex, color);
mWorkSpace.handleOperation(effectOPMultiSubtitleColor);
38)字幕文本对齐方式 单字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// align表示对齐方式 {@see TextBuble}
EffectOPSubtitleAlign effectOPSubtitleAlign = new EffectOPSubtitleAlign(effectIndex, align);
mWorkSpace.handleOperation(effectOPSubtitleAlign);
组合字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// textIndex表示组合字幕中的第几个字幕
// align表示对齐方式
EffectOPMultiSubtitleAlign effectOPMultiSubtitleAlign = new EffectOPMultiSubtitleAlign(effectIndex, textIndex, align);
mWorkSpace.handleOperation(effectOPMultiSubtitleAlign);
备注:对齐方式为下列参数,在{@class TextBuble} 中定义,可以进行 '|' 位运算合并。
public static final int ALIGNMENT_NONE = 0;
public static final int ALIGNMENT_FREE_STYLE = 0;
public static final int ALIGNMENT_LEFT = 1;
public static final int ALIGNMENT_RIGHT = 2;
public static final int ALIGNMENT_TOP = 4;
public static final int ALIGNMENT_BOTTOM = 8;
public static final int ALIGNMENT_MIDDLE = 16;
public static final int ALIGNMENT_HOR_CENTER = 32;
public static final int ALIGNMENT_VER_CENTER = 64;
public static final int ALIGNMENT_HOR_FULLFILL = 128;
public static final int ALIGNMENT_VER_FULLFILL = 256;
public static final int ALIGNMENT_UNDER_CENTER = 512;
public static final int ALIGNMENT_ABOVE_CENTER = 1024;
39)字幕文本阴影 单字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// shadowInfo表示文本阴影信息 {@see ShadowInfo}
EffectOPSubtitleShadow effectOPSubtitleShadow = new EffectOPSubtitleShadow(effectIndex, shadowInfo);
mWorkSpace.handleOperation(effectOPSubtitleShadow);
组合字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// textIndex表示组合字幕中的第几个字幕
// shadowInfo表示文本阴影信息 {@see ShadowInfo}
EffectOPMultiSubtitleShadow effectOPMultiSubtitleShadow = new EffectOPMultiSubtitleShadow(effectIndex, textIndex, shadowInfo);
mWorkSpace.handleOperation(effectOPMultiSubtitleShadow);
40)字幕文本描边 单字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// strokeInfo表示文本描边信息 {@see StrokeInfo}
EffectOPSubtitleStroke effectOPSubtitleStroke = new EffectOPSubtitleStroke(effectIndex, strokeInfo);
mWorkSpace.handleOperation(effectOPSubtitleStroke);
组合字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// textIndex表示组合字幕中的第几个字幕
// strokeInfo表示文本描边信息 {@see StrokeInfo}
EffectOPMultiSubtitleStroke effectOPMultiSubtitleStroke = new EffectOPMultiSubtitleStroke(effectIndex, textIndex, strokeInfo);
mWorkSpace.handleOperation(effectOPMultiSubtitleStroke);
41)字幕文本粗体 单字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// isBlod表示是否设置粗体
EffectOPSubtitleBlod effectOPSubtitleBlod = new EffectOPSubtitleBlod(effectIndex, isBlod);
mWorkSpace.handleOperation(effectOPSubtitleBlod);
组合字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// textIndex表示组合字幕中的第几个字幕
// isBlod表示是否设置粗体
EffectOPMultiSubtitleBlod effectOPMultiSubtitleBlod = new EffectOPMultiSubtitleBlod(effectIndex, textIndex, isBlod);
mWorkSpace.handleOperation(effectOPMultiSubtitleBlod);
42)字幕文本斜体 单字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// isItalic表示是否设置斜体
EffectOPSubtitleItalic effectOPSubtitleItalic = new EffectOPSubtitleItalic(effectIndex, isItalic);
mWorkSpace.handleOperation(effectOPSubtitleItalic);
组合字幕:
// groupId默认为GROUP_ID_SUBTITLE
// effectIndex为同类型中第几个效果
// textIndex表示组合字幕中的第几个字幕
// isItalic表示是否设置斜体
EffectOPMultiSubtitleItalic effectOPMultiSubtitleItalic = new EffectOPMultiSubtitleItalic(effectIndex, textIndex, isItalic);
mWorkSpace.handleOperation(effectOPMultiSubtitleItalic);
43)获取画中画抠色图片
// groupId为effect的类型
// effectIndex为同类型中第几个效果
EffectOPCreateChromaColor effectOPCreateChromaColor = new EffectOPCreateChromaColor(groupId, effectIndex);
mWorkSpace.handleOperation(effectOPCreateChromaColor);
操作执行结束回调时,可以通过下面方法获取抠色图片:
ChromaColor chromaColor = effectOPCreateChromaColor.getChromaColor();
抠色图片可以获取效果特定位置的颜色值:
// relateX和relateY是相对以画中画为坐标系本身偏移的位置
chromaColor.getColorByPosition(float relateX, float relateY);
注意:取的抠色图片,是取播放器当前时间,该效果的图片。所以需要保证播放器当前时间该图片是显示中,切取色只能取可见区域内的颜色。
当抠色图片不再使用时,需要释放资源:
chromaColor.recycle();
44)关键帧设置
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// effectKeyFrameInfo表示关键帧数据,每次都需要设置完整列表 {@see EffectKeyFrameInfo}
EffectOPKeyFrame effectOPKeyFrame = new EffectOPKeyFrame(groupId, effectIndex, effectKeyFrameInfo);
mWorkSpace.handleOperation(effectOPKeyFrame);
45)更新某类关键帧数据列表(目前只支持位置相关关键帧,Position、AnchorOffset、Scale和Rotation、Alpha)
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// keyFrameType表示关键帧类型 {@see BaseKeyFrame.KeyFrameType}
// keyFrames表示该类关键帧列表数据,需要设置完整列表 {@see BaseKeyFrame}
EffectOPKeyFrameUpdate effectOPKeyFrameUpdate = new EffectOPKeyFrameUpdate(groupId, effectIndex, keyFrameType, keyFrames);
mWorkSpace.handleOperation(effectOPKeyFrameUpdate);
46)插入单个关键帧(相同时间存在则替换,目前只支持位置相关关键帧,Position、AnchorOffset、Scale和Rotation)
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// baseKeyFrame表示单个关键帧数据 {@see BaseKeyFrame}
EffectOPKeyFrameInsert effectOPKeyFrameInsert = new EffectOPKeyFrameInsert(groupId, effectIndex, baseKeyFrame);
mWorkSpace.handleOperation(effectOPKeyFrameInsert);
47)删除某个时间的关键帧(目前只支持位置相关关键帧,Position、AnchorOffset、Scale和Rotation)
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// keyFrameType表示关键帧类型 {@see BaseKeyFrame.KeyFrameType}
// offsetTime表示关键帧相对时间ts
EffectOPKeyFrameRemove effectOPKeyFrameRemove = new EffectOPKeyFrameRemove(groupId, effectIndex, keyFrameType, offsetTime);
mWorkSpace.handleOperation(effectOPKeyFrameRemove);
48)修改关键帧的偏移量(目前只支持位置相关关键帧,Position、AnchorOffset、Scale和Rotation)
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// keyFrameType表示关键帧类型 {@see BaseKeyFrame.KeyFrameType}
// offsetValue表示关键帧值的偏移量 {@see Ve3DDataF}
EffectOPKeyFrameUpdateOffset effectOPKeyFrameUpdateOffset = new EffectOPKeyFrameUpdateOffset(groupId, effectIndex, keyFrameType, offsetValue);
mWorkSpace.handleOperation(effectOPKeyFrameUpdateOffset);
49)修改全部关键帧的偏移量(目前只支持位置相关关键帧,Position、AnchorOffset、Scale和Rotation)
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// posOffsetValue表示位置关键帧值的偏移量,null表示不修改 {@see Ve3DDataF}
// rotateOffsetValue表示角度关键帧值的偏移量,null表示不修改 {@see Ve3DDataF}
// scaleOffsetValue表示缩放关键帧值的偏移量,null表示不修改 {@see Ve3DDataF}
// anchorOffsetValue表示锚点关键帧值的偏移量,null表示不修改 {@see Ve3DDataF}
EffectOPKeyFrameUpdateOffsetAll effectOPKeyFrameUpdateOffsetAll = new EffectOPKeyFrameUpdateOffsetAll(groupId, effectIndex, posOffsetValue, rotateOffsetValue, scaleOffsetValue, anchorOffsetValue);
mWorkSpace.handleOperation(effectOPKeyFrameUpdateOffsetAll);
50)修改蒙版关键帧数据
// groupId为effect的类型
// effectIndex为同类型中第几个效果
// maskKeyFrameInfo表示蒙版关键帧数据,null表示清除关键帧 {@see MaskKeyFrameInfo}
EffectOPMaskKeyFrame effectOPMaskKeyFrame = new EffectOPMaskKeyFrame(groupId, effectIndex, maskKeyFrameInfo);
mWorkSpace.handleOperation(effectOPMaskKeyFrame);
// 用于保存工程当前状态
BaseOPSavePrj baseOPSavePrj = new BaseOPSavePrj();
mWorkSpace.handleOperation(baseOPSavePrj);
/**
* 开始导出
*
* @return 导出控制器, 用于停止导出
*/
IExportController controller = workSpace.startExport(ExportParams params, IExportListener listener);
ExportParams参数说明:
名称 | 解释 | 类型 |
---|---|---|
outputPath | 导出文件路径,需要带后缀,提取音频则只支持m4a(android 10以上请使用有完整读写权限的私有目录绝对路径或content的uri路径) | String |
expType | 导出分辨率类型 | int |
isGif | 是否导出Gif图片 | boolean |
isSoftwareCodec | 是否软件编解码,默认使用硬件 | boolean |
videoBitrateScales | 视频比特率浮动 参数,默认不变,设置了customBitrate 后,就只使用customBitrate | float |
customBitrate | 自定义比特率, <=0表示非自定义 | int |
customFps | 自定义帧率, <=0表示非自定义, sdk将根据自己的算法设定fps | int |
isFullKeyFrame | 是否纯i帧,只支持转码时使用 | boolean |
exportRange | 导出时间区域 | VeRange |
customLimitSize | 自定义的导出分辨率限制,使用自定义的话,expType就不重要了,只会判断是否gif | VeMSize |
IExportController导出控制器说明:
public interface IExportController {
/** 切换后台导出,降低导出时的cpu使用率,导出时间将拉长,存在失败风险 */
int change2Back();
/** 切换前台导出,恢复导出时的cpu使用率 */
int change2Fore();
/** 取消 */
int cancel();
}
IExportListener导出回调监听
public interface IExportListener {
/** 导出准备就绪 */
void onExportReady();
/** 导出中 */
void onExportRunning(int percent);
/** 导出成功,exportPath导出视频路径 */
void onExportSuccess(String exportPath);
/** 导出取消 */
void onExportCancel();
/** 导出失败 */
void onExportFailed(int nErrCode, String errMsg);
/** 导出资源已释放,取消、失败、成功后都会释放 */
void onProducerReleased();
}
由于各开发者对剪辑玩法关联的期望不同,为了支持开发者在玩法上的创意想法,剪辑操作允许开发者进行自定义组合。 如:开发者期望对Clip倒放后立刻对Clip进行静音。则开发者可以自定义操作符:
public class ClipOPReverseMute extends BaseOperate {
private int clipIndex;
public ClipOPReverseMute(int clipIndex) {
this.clipIndex = clipIndex;
}
@Override protected boolean operateRun(IEngine engine) {
// 编辑倒放
ClipOPReverse clipOPReverse = new ClipOPReverse(clipIndex, true);
clipOPReverse.operate(engine);
// 编辑静音
ClipOPMute clipOPMute = new ClipOPMute(clipIndex, true);
clipOPMute.operate(engine);
// 返回最终的成功/失败
return true;
}
}
然后再需要时执行操作ClipOPReverseMute即可
ClipOPReverseMute clipOPReverseMute = new ClipOPReverseMute(clipIndex);
workspace.handleOperation(clipOPReverseMute);
当开发者想进行一些撤销/重做的玩法时,可以在进行剪辑操作前,对需要支持撤销的剪辑设置是否支持undo。即:
// 设置支持undo
baseOperate.setSupportUndo(true);
设置后,workspace将对当前操作前的状态,记录一个状态点。(注:目前最多支持30个undo/redo的记录点)
当需要返回上一个记录点时,执行撤销:
// 执行撤销
workspace.undo();
当需要取消撤销动作时时,可以返回上一次执行撤销前的状态。执行重做:
// 执行重做
workspace.redo();
由于撤销/重做都有数量,所以可以通过注册监听器的方式,获取undo/redo的数量回调。
workspace.setDequeCountListener(IDequeCountListener);
IDequeCountListener说明:
public interface IDequeCountListener {
// undoSize为数量变化时的目前可以支持的undo()操作数量
// redoSize为数量变化时的目前可以支持的redo()操作数量
void onDequeCountChange(int undoSize, int redoSize);
}
执行Undo/Redo时,对通知出去的Operate将会进行包装。Undo通知的为UndoOperate,Redo通知的为RedoOperate。获取源操作符的方式为:
UndoOperate.getSrcOperate();
RedoOperate.getSrcOperate();
BaseOperate中关于Undo/Redo的信息:
// 是否处理过undo
operate.isUndoHandled();
// 是否处理undo
operate.isDoingUndo();
// 获取操作类型
BaseOperate.EngineWorkType type = operate.getOperateType();
BaseOperate.EngineWorkType参数说明:
名称 | 解释 |
---|---|
normal | 正常 |
undo | 撤销 |
redo | 重做 |
当初始化时设置isUseStuffClip为true时,即开启自由黑帧模式。自由黑帧模式和普通剪辑模式的主要区别,即在对效果出入区间的限制上。
如果片段clip的播放效果总时长在60s,而贴纸效果的出入区间是在55s70s。则导出时,视频总长度只会是60s,贴纸时间为55s60s,60s以后的内容将自动截断。
普通剪辑模式下,导出视频的总长度,由片段的最终时长决定。
如果片段clip的播放效果总时长在60s,而贴纸效果的出入区间是在55s70s。则导出时,视频总长度将会是70s,贴纸时间为55s70s,60s以后的片段内容将是黑帧画面,但是不影响贴纸的内容展示。
自有黑帧模式下,导出视频的总长度,由效果和片段的最终时长共同决定。
/**
* 创建新的卡点视频工程
*/
QEEngineClient.createNewSlideProject(long themeId, List<String> nodePathList, QESlideWorkSpaceListener listener);
/**
* 加载卡点视频工程
*/
QEEngineClient.loadSlideProject(String projectPath, QESlideWorkSpaceListener listener);
【详情请参看剪辑工程工程删除相关。】
【详情请参看剪辑工程播放器相关。】
ArrayList<SlideInfo> slideInfos = workspace.getSlideInfoList();
SlideInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
filePath | 片段文件路径 | String |
sourceType | 文件类型{@see Type} | SlideInfo.Type |
index | 索引 | int |
duration | 片段时长 | int |
previewPos | 预览位置 | int |
mSlidePosInfo | 位置信息{@see SlidePosInfo} | SlidePosInfo |
SlideInfo.Type参数说明:
名称 | 解释 |
---|---|
Image | 图片 |
Video | 视频 |
SlidePosInfo参数说明:
名称 | 解释 | 类型 |
---|---|---|
mAngle | 旋转角度(0~360) | int |
width | 宽,相对于streamsize | float |
height | 高,相对于streamsize | float |
centerX | 中心点x,相对于streamsize | float |
centerY | 中心点y,相对于streamsize | float |
1)排序
// 将from位置的片段移动到to位置
SlideOPMove slideOPMove = new SlideOPMove(from, to);
mWorkSpace.handleOperation(slideOPMove);
2)替换
// clipIndex表示第几个片段,从0开始
// filePath表示视频/图片路径
SlideOPReplace slideOPReplace = new SlideOPReplace(clipIndex, filePath);
mWorkSpace.handleOperation(slideOPReplace);
3)修改片段位置
// clipIndex表示第几个片段,从0开始
// slidePosInfo表示位置信息
SlideOPPosition slideOPPosition = new SlideOPPosition(clipIndex, slidePosInfo);
mWorkSpace.handleOperation(slideOPPosition);
【详情请参看剪辑工程导出相关。】
/**
* 获取工程封面
*/
Bitmap bitmap = wrokspace.getProjectThumbnail();
/**
* 获取工程封面
*/
Bitmap bitmap = wrokspace.getProjectThumbnail(int offset);
/**
* engine接口createThumbnailManager,需要配对调用 destroyThumbnailManager;
* 否则容易造成内存泄漏;
*/
Bitmap bitmap = wrokspace.getClipThumbnail(int index, int width, int height);
/**
* engine接口createThumbnailManager,需要配对调用 destroyThumbnailManager;
* 否则容易造成内存泄漏;
*/
Bitmap bitmap = wrokspace.getClipThumbnail(int index, int offset, int width, int height);
工具:QEThumbnailTools
/**
* 获取图片文件的缩略图(jpeg/png/gif等)
*
* @param offset gif时,可以取某个时间点的缩略图
*/
Bitmap bitmap = QEThumbnailTools.getPicFileThumbnail(String filePath, int width, int height, int offset);
/**
* 获取视频文件缩略图
*/
Bitmap bitmap = QEThumbnailTools.getVideoThumbnail(String filePath, int width, int height, int offset);
/**
* 视频倒放
*
* @param reverseSrcFile 原始文件全路径。
*/
IExportController controller = QETools.reverseFile(final String reverseSrcFile, ExportParams params, IExportListener listener);
/**
* 将外部文件导出成适合添加到我们工程的文件(转码TRANSCODE etc...)。 MPEG4编码
* 转码
*/
IExportController controller = QETools.convertVideo(String srcPath, ExportParams params, IExportListener listener);
/**
* 提取音频
*/
IExportController controller = QETools.directAudio(String srcPath, ExportParams params, IExportListener listener);
/**
* 通过引擎解析音频波形数据,数据是一段一段解析回调出来
* 由于数据量比较大(32k左右),app采用1s 40帧的筛选
* 目前是去两极,value [0,1]
* 取的左声道
*
*/
int iRes = QETools.extractAudioWave(String audioPath, VeRange srcRange, IAudioDataListener audioDataListener);