全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
视频点播

专业版

更新时间:2018-06-20 21:41:52

一、快速开始

1.1 开发环境配置

本SDK开发环境为 JAVA1.7 | ANDROID SDK API LEVEL 18

1.2 Demo集成

Demo工程结构

Demo的文件结构如图所示:

目录结构

Demo讲解

sample目录为demo的根目录,内部一共包含DEMO,AliyunCrop,AliyunRecorder,AliyunEditor,AliyunImport,AliyunVideoSdk,AliyunResample,AliyunHelp,AliyunFileDownloader,9个基本moudle(STMobileJNI为旧版本接入商汤人脸识别的示例代码,可以忽略)。其中DEMO是作为整个SDK的模块选择界面,AliyunCrop是裁剪模块的示例代码,AliyunRecorder是魔法相机模块的示例代码,AliyunEditor是视频编辑模块的示例代码,AliyunImport是导入模块的示例代码,AliyunHelp是其他模块的示例代码,AliyunVideoSdk是SDK提供的接口,AliyunResample是提供的一个音频重采样的工具,如果需要该功能,则SDK集成时需要libaliresample.so,否则不需要。

Demo依赖关系为:DEMO依赖AliyunCrop,AliyunRecorder,AliyunEditor,AliyunImport和AliyunHelp。AliyunCrop,AliyunRecorder,AliyunEditor和AliyunImport依赖AliyunVideoSdk。

Demo的依赖结构如图所示:

依赖关系

1.3 导入SDK

导入aar

将sdk目录中提供的AliyunSdk-RCE.aar以module的方式添加到工程中,如下图所示:

add aar module1

add aar module 2

然后在自己的app module中添加对该module的依赖,如下:

app中添加对AAR module的依赖

导入.so文件

由于目前只提供了armeabi-v7a的.so,因此,开发者需要删除其他的abi目录,保证最终打出的apk包中只有一个armeabi-v7a的abi目录。

请将SDK解压包中的jniLibs目录拷贝到app module的main目录中,并且在app module的build.gradle文件中声明jniLibs的路径,如下:

  1. android {
  2. sourceSets.main {
  3. jni.srcDirs = []
  4. jniLibs.srcDir "src/main/jniLibs"
  5. }
  6. }

在app的Application文件中加载动态链接库,库文件说明如下:

  1. libAliFaceAREngine.so---------------人脸识别相关的库(不需要人脸识别功能可不加载)
  2. libFaceAREngine.so------------------人脸识别相关的库(不需要人脸识别功能可不加载)
  3. libfdk-aac.so-----------------------音频编解码相关的库(必须load
  4. liblive-openh264.so-----------------视频编码相关的库(必须load
  5. libQuCore.so------------------------SDK核心库(必须load
  6. libQuCore-ThirdParty.so-------------SDK依赖的第三方库(必须load
  7. libaliresample.so-------------------音频重采样相关的库(不需要可以去掉)

在App自定义Application类的onCreate方法里面执行动态库加载:

  1. System.loadLibrary("fdk-aac");
  2. System.loadLibrary("live-openh264");
  3. System.loadLibrary("QuCore-ThirdParty");
  4. System.loadLibrary("QuCore");
  5. System.loadLibrary("FaceAREngine");
  6. System.loadLibrary("AliFaceAREngine");

添加必要的依赖项

SDK中依赖了以下必要的第三方库,需要用户添加,版本只需兼容下列版本即可

  1. compile 'com.google.code.gson:gson:2.8.0'
  2. compile 'com.squareup.okhttp3:okhttp:3.2.0'

初始化相关配置

在App的Application类onCreate方法中调用

  1. com.aliyun.common.httpfinal.QupaiHttpFinal.getInstance().initOkHttpFinal();
  2. com.aliyun.vod.common.httpfinal.QupaiHttpFinal.getInstance().initOkHttpFinal();

1.4 权限要求

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  3. <uses-permission android:name="android.permission.CAMERA" />
  4. <uses-permission android:name="android.permission.FLASHLIGHT" />
  5. <uses-permission android:name="android.permission.RECORD_VIDEO" />
  6. <uses-permission android:name="android.permission.RECORD_AUDIO" />
  7. <uses-permission android:name="android.permission.INTERNET" />
  8. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Android 6.0以上系统需要做动态权限请求。

1.5 混淆配置

找到Demo工程中,Demo module下的混淆配置文件,然后将其中的配置信息拷贝到自己项目的混淆配置中即可

混淆配置路径

1.6 概念介绍

RAM和STS

RAM和STS是阿里云提供的权限管理系统。RAM主要的作用是控制账号系统的权限。通过使用RAM可以将在主账号的权限范围内创建子用户,给不同的子用户分配不同的权限从而达到授权管理的目的。STS是一个安全凭证(Token)的管理系统,用来授予临时的访问权限,这样就可以通过STS来完成对于临时用户的访问授权。详细参考STS介绍

临时AccessKeyId、AccessKeySecret和SecurityToken

开启RAM授权,并通过STS授权系统提供的OpenAPI或SDK获取的AccessKeyId、AccessKeySecret和SecurityToken,用于播放和下载请求(V3.2.0版起推荐使用STS的播放方式)。详见:STS SDK参考

1.7 资源说明

SDK涉及到的资源主要是人脸识别模型资源、滤镜资源、动效滤镜资源,考虑到包大小的问题,这些资源都可以放在网络端,在APP启动时下载下来,也可以直接打包到apk中,但是SDK不支持assets流,所以如果是打包到apk中,则启动后必须将资源拷贝到SD Card中,然后再使用。资源文件及对应的详细使用说明可以在SDK的下载包中找到。

1.8 SDK设计讲解

工程概念(Project)

短视频SDK内部对于录制、编辑都会有一个Project的概念,以录制举例,一个Project中会有很多个Clip,而多段录制,实际上就是录制一个一个的Clip,添加的特效信息比如背景音乐、贴图、MV、水印等等都会以配置信息的方式存储在Project对象中,Project对象可以持久化到本地文件当中——project.json,这个文件由短视频SDK创建。这样有个好处就是录制、编辑、合成三个模块可以通过这个配置文件互相传递流程,比如编辑加载编辑资源时是通过反序列化一个project.json来进行的,而project.json可以在录制模块通过AliyunIRecorder#finishRecordingForEditor()接口来获取,也可以通过AliyunIImport#generateProjectConfigure();来获取,分别对应多段录制和多段导入。编辑完的视频如果要通过AliyunICompose进行合成,也要先将这些配置信息持久化到project.json文件中,AliyunICompose才能够对project.json进行反序列化,得到正确的工程配置,然后进行合成,否则会出现合成的视频不包含特效的情况。以上概念也会贯穿在下面的接口使用说明中,更多详细信息可以参考各接口对应的接口文档。

二、功能使用

2.1 录制功能

以下仅为录制相关的功能接口列举,具体接口使用详情,请参考对应的接口文档。

初始化/销毁

  • 创建录制接口实例
    1. AliyunIRecorder recorder = AliyunRecorderCreator.getRecorderInstance(Context context);//参数context为当前页面的上下文
  • 销毁录制接口实例
    1. AliyunIRecorder#destroy();
    2. AliyunRecorderCreator#destroyRecorderInstance();

    摄像头控制+预览

  • 设置摄像头类型
    1. AliyunIRecorder#setCamera(CameraType cameraType);
  • 设置摄像头预览参数(闪光灯、对焦模式、zoom、曝光度)
    1. AliyunIRecorder#setCameraParam(CameraParam cameraParam);//也可以单独设置,参考下面的接口
  • 切换摄像头
    1. AliyunIRecorder#switchCamera();
  • 设置闪光灯模式
    1. AliyunIRecorder#setLight(FlashType flashType);
  • 设置Zoom
    1. AliyunIRecorder#setZoom(float rate);
  • 设置曝光度
    1. AliyunIRecorder#setExposureCompensationRatio(float value);
  • 设置对焦模式
    1. AliyunIRecorder#setFocusMode(int mode);
  • 手动对焦
    1. AliyunIRecorder#setFocus(float xRatio, float yRatio);
  • 设置录制预览窗口View(GLSurfaceView)
    1. AliyunIRecorder#setDisplayView(GLSurfaceView glSurfaceView);//参数glsurfaceView为用户自己定义的GLSurfaceView及其子类对象
  • 设置传感器角度值(非常重要,建议仔细阅读接口文档)
    1. AliyunIRecorder#setRotation(int rotation);
  • 设置人脸角度的检测值(非常重要,建议仔细阅读接口文档)
    1. AliyunIRecorder#setFaceDetectRotation(int rotation);
  • 设置录制视频的角度(非常重要,建议仔细阅读接口文档)
    1. AliyunIRecorder#setRecordRotation(int rotation);
  • 开启预览
    1. AliyunIRecorder#startPreview();
  • 结束预览
    1. AliyunIRecorder#stopPreview();

    美颜

  • 设置美颜程度
    1. AliyunIRecorder#setBeautyLevel(int level);
  • 设置美颜开关
    1. AliyunIRecorder#setBeautyStatus(boolean on);

    滤镜

  • 设置普通滤镜效果
    1. AliyunIRecorder#applyFilter(EffectFilter effectFilter);//参数设置为null表示移除滤镜效果
  • 移除滤镜效果
    1. AliyunIRecorder#applyFilter(null);

    动效滤镜

  • 设置动效滤镜(灵魂出窍等)
    1. AliyunIRecorder#applyAnimationFilter(EffectFilter effectFilter);
  • 移除动效滤镜
    1. AliyunIRecorder#removeAnimationFilter(EffectFilter effctFilter);

    人脸识别

  • 设置人脸坐标数据(接入第三方人脸识别时会用到)
    1. AliyunIRecorder#setFace(float[][] faces);
  • 设置是否需要使用SDK内置的人脸识别
    1. AliyunIRecorder#needFaceTrackInternal(boolean need);
  • 为SDK内置的人脸识别指定模型文件
    1. AliyunIRecorder#setFaceTrackInternalModelPath(String path);
  • 设置SDK内置人脸识别支持的最大人脸个数
    1. AliyunIRecorder#setFaceTrackInternalMaxFaceCount(int maxFaceCount);

    动图

  • 添加人脸动图
    1. AliyunIRecorder#addPaster(EffectPaster effectPaster);
  • 添加普通动图
    1. AliyunIRecorder#addPaster(EffectPaster effectPaster,float sx,float sy,float sw,float sh,float rotation,boolean flip);
  • 移除动图
    1. AliyunIRecorder#removePaster(EffectPaster effectPaster);

    静态贴纸/水印

  • 添加静态水印/静态贴纸
    1. AliyunIRecorder#addImage(EffectImage effctImage);
  • 移除静态水印/静态贴纸
    1. AliyunIRecorder#removeImage(EffectImage effctImage);

    魔法音乐(MV)

  • 使用魔法音乐(MV)
    1. AliyunIRecorder#applyMv(EffectBean effectMv);
  • 暂停魔法音乐播放(MV)
    1. AliyunIRecorder#pauseMv();
  • 恢复魔法音乐播放
    1. AliyunIRecorder#resumeMv();
  • 重新播放魔法音乐
    1. AliyunIRecorder#restartMv();

    背景音乐

  • 设置背景音乐
    1. AliyunIRecorder#setMusic(String path,long startTime,long duration);
  • 移除背景音乐
    1. AliyunIRecorder#setMusic(null, 0, 0);

    变速

  • 设置录制变速
    1. AliyunIRecorder#setRate(float rate);

    自定义渲染

  • 设置自定义渲染的回调
    1. AliyunIRecorder#setOnTextureIdCallback(OnTextureIdCallBack callback);

拍照

  • 带特效拍照
    1. AliyunIRecorder#takePhoto(boolean needBitmap);
  • 系统拍照(不带特效)
    1. AliyunIRecorder#takePicture(boolean needBitmap);
  • 设定系统拍照的照片大小(只支持系统拍照,特效拍照不支持)
    1. AliyunIRecorder#setPictureSize(Camera.Size size);

录制

  • 设置录制视频输出参数(预览帧率、编码帧率、输出分辨率、编码器类型)
    1. AliyunIRecorder#setMediaInfo(MediaInfo mediaInfo);//相关参数描述请参考MedianInfo的接口文档
  • 设置输出路径
    1. AliyunIRecorder#setOutputPath(String path);
  • 设置录制视频质量
    1. AliyunIRecorder#setVideoQuality(VideoQuality quality);
  • 设置录制视频的码率
    1. AliyunIRecorder#setVideoBitrate(int bitrate);//单位:kbps
  • 设置输出视频的GOP大小
    1. AliyunIRecorder#setGop(int gop);//单位:帧数
  • 开始录制一个片段视频
    1. AliyunIRecorder#startRecording();
  • 停止录制一个片段视频
    1. AliyunIRecorder#stopRecording();
  • 取消录制一个片段视频
    1. AliyunIRecorder#cancelRecording();
  • 结束录制,并且将录制片段视频拼接成一个视频
    1. AliyunIRecorder#finishRecording();
    • 结束录制,生成片段视频的配置信息(不拼接片段)
      1. AliyunIRecorder#finishRecordingForEdit();
  • 设置静音录制
    1. AliyunIRecorder#setMute(boolean isMute);

    录制视频片段管理

  • 获取片段管理器
    1. AliyunIRecorder#getClipManager();
  • 设置最大录制时长(总录制时长,不是单个片段的最大时长)
    1. AliyunIClipManager#setMaxDuration(int maxDurationMs);
  • 设置最小录制时长(总录制时长,不是单个片段的时长)
    1. AliyunIClipManager#setMinDuration(int minDurationMs);
  • 获取片段总时长
    1. AliyunIClipManager#getDuration();
  • 获取总的片段数量
    1. AliyunIClipManager#getPartCount();
  • 删除最后一段片段
    1. AliyunIClipManager#deletePart();
  • 删除指定的片段
    1. AliyunIClipManager#deletePart(int index);
  • 删除所有片段
    1. AliyunIClipManager#deleteAllPart();
  • 获取片段路径列表
    1. AliyunIClipManager#getVideoPathList();

    回调相关

  • 设置录制回调
    1. AliyunIRecorder#setRecordCallBack(RecordCallback callBack);
  • 设置视频帧采集回调
    1. AliyunIRecorder#setOnFrameCallback(OnFrameCallBack callback);
  • 设置音频采集数据的回调
    1. AliyunIRecorder#setOnAudioCallback(OnAudioCallBack callback);

    其他

  • 设置特效信息(水印、静态贴纸、动图)信息(位置、大小)
    1. AliyunIRecorder#setEffectView(float xRatio,float yRatio,float widthRatio,float heightRatio,EffectBase effectBase);
  • 获取摄像头数量
    1. AliyunIRecorder#getCameraCount();

    2.2裁剪

    初始化

    本模块相关接口用来创建/销毁裁剪实例
  • 创建裁剪实例
    1. AliyunCropCreator#getCropInstance(Context context);
  • 销毁实例
    1. AliyunICrop#dispose();//释放资源
    2. AliyunCropCreator#destroyCropInstance();

    裁剪(视频/音频/照片)

    本模块相关接口可以用来对视频、音频、照片文件进行裁剪
  • 设置裁剪参数
    1. AliyunICrop#setCropParam(CropParam param);
  • 开始裁剪
    1. AliyunICrop#startCrop();
  • 取消裁剪
    1. AliyunICrop#cancel();
  • 设置回调用
    1. AliyunICrop#setCropCallback(CropCallback callback);

    2.3编辑

    以下仅为编辑相关的功能接口列举,具体接口使用详情,请参考对应的接口文档。

    初始化

    本模块相关接口用来创建/销毁编辑器实例
  • 创建编辑器
    1. AliyunEditorFactory#creatAliyunEditor(Uri uri)
  • 初始化编辑器
    1. AliyunIEditor#init(SurfaceView surfaceView);//设置预览窗口

    导入视频源(编辑前导入)

    本模块相关接口可以用来在编辑开始前组装视频源,获取编辑初始化需要的URI路径
  • 导入添加视频/照片
    1. AliyunIImport#addMediaClip(AliyunClip clip);
  • 导入移除视频/照片
    1. AliyunIImport#removeMedia(int id);
  • 导入更换顺序
    1. AliyunIImport#swap(int pos1, int pos2);
  • 导入生成视频源配置文件
    1. AliyunIImport#generateProjectConfigure();
  • 导入设置合成输出参数(帧率、码率、GOP、输出分辨率、编码器、质量等级、画面模式)
    1. AliyunIImport#setVideoParam(AliyunVideoParam param);

    更新视频源(编辑中动态更新)" class="reference-link">更新视频源(编辑中动态更新)

    本模块相关接口可以用来在编辑过程中动态裁剪视频、动态更换视频源、动态调整视频转场时间及转场效果
  • 获取视频源管理器
    1. AliyunIEditor#getSourcePartManager();//获取视频源管理器
  • 在最后添加视频/照片
    1. AliyunIClipConstructor#addMediaClip(AliyunClip clip);
  • 在指定位置的添加视频/照片
    1. AliyunIClipConstructor#addMediaClip(int index, AliyunClip clip);
  • 更新替换指定位置的视频源
    1. AliyunIClipConstructor#updateMediaClip(int index, AliyunClip clip);
  • 删除最后一个视频源
    1. AliyunIClipConstructor#deleteMediaClip();
  • 删除某一个指定的视频源
    1. AliyunIClipConstructor#deleteMediaClip(int index);
  • 应用新的视频源列表(会清空旧的)
    1. AliyunIClipConstructor#updateAllClips(List<AliyunClip> clips);
  • 获取当前视频源个数
    1. AliyunIClipConstructor#getMediaPartCount();
  • 获取当前视频源列表
    1. AliyunIClipConstructor#getAllClips();
  • 交换视频源顺序
    1. AliyunIClipConstructor#swap(int pos1, int pos2);
  • 应用更新的视频源
    1. AliyunIEditor#applySourceChange();//应用更新的视频源

    预览播放控制

    该模块相关接口用来控制编辑器的预览播放
  • 更换显示窗口
    1. AliyunIEditor#setDisplayView(SurfaceView surfaceView);
    2. AliyunIEditor#setDisplayView(TextureView textureView);//没有特殊需求不推荐使用该接口
  • 开始播放
    1. AliyunIEditor#play();
  • Seek
    1. AliyunIEditor#seek();
  • 暂停播放
    1. AliyunIEditor#pause();
  • 继续播放
    1. AliyunIEditor#resume();
  • 停止播放
    1. AliyunIEditor#stop();
  • 获取当前流的位置(不受时间特效影响)
    1. AliyunIEditor#getCurrentStreamPosition();
  • 获取当前播放的位置(受时间特效影响,即当前的播放时间)
    1. AliyunIEditor#getCurrentPlayPosition();
  • 获取流时长(不受时间特效影响)
    1. AliyunIEditor#getStreamDuration();
  • 获取播放总时长(受时间特效影响)
    1. AliyunIEditor#getDuration();
  • 设置静音播放
    1. AliyunIEditor#setAudioSilence(boolean silence);
  • 设置音量
    1. AliyunIEditor#setVolume(int volume);
  • 设置视频显示模式
    1. AliyunIEditor#setDisplayMode(VideoDisplayMode mode);
  • 填充模式下设置填充背景色
    1. AliyunIEditor#setFillBackgroundColor(int color);

    滤镜

    该模块接口用来编辑滤镜效果
  • 使用滤镜效果
    1. AliyunIEditor#applyFilter(EffectBean effect);
  • 移除滤镜效果
    1. AliyunIEditor#applyFilter(null);//设置为null即表示移除滤镜

    动效滤镜

    该模块接口用来编辑动效滤镜(灵魂出窍等)效果
  • 添加特效滤镜
    1. AliyunIEditor#addAnimationFilter(EffectFilter filter);
  • 移除特效滤镜
    1. AliyunIEditor#removeAnimationFilter(EffectFilter filter);
  • 清除所有的特效滤镜

    1. AliyunIEditor#clearAllAnimationFilter();

    动图/气泡/文字(使用UI控制器)

    该模块接口用编辑动图效果简介:使用UI控制器添加动图,是指阿里云SDK针对短视频常见的动图交互逻辑(缩放、旋转、镜像)封装的一套动图控制框架,涉及几个核心接口AliyunIEditor、AliyunPasterManager、AliyunPasterController、AliyunPasterBaseView。在该框架下的贴图交互一定遵循Demo所展示的交互规则。AliyunIEditor——编辑器的核心类;AliyunPasterManager——UI控制框架中的贴图/字幕管理器,负责添加贴图;AliyunPasterController——UI控制框架中针对单个贴图的控制器,负责操作贴图的显隐及移除操作,也可以用来设置或者获取一些贴图相关的属性,比如显示时长等等;AliyunPasterBaseView——UI控制框架中对贴图展示View的接口抽象,如果开发者需要在不改动交互的情况下对贴图展示的UI进行自定义,则只需要实现该接口即可。

  • 获取动图管理器(AliyunPasterManager)

    1. AliyunIEditor#createPasterManager();
  • 设置动图显示区域的大小(==必须在AliyunIEditor#init之前调用该接口==)
    1. AliyunPasterManager#setDisplaySize(int width, int height);
  • 添加普通动图/气泡动图(返回UI controller——AliyunPasterController)
    1. AliyunPasterManager#addPaster(String path);//全局
    2. AliyunPasterManager#addPasterWithStartTime(String path, long startTime, long duration);//指定时间段内
  • 添加文字
    1. AliyunPasterManager#addSubtitle(String text, String font);//全局
    2. AliyunPasterManager#addSubtitleWithStartTime(String text, String font, long startTime, long duration);//指定时间段
  • 设置动图/气泡/文字的UI实现View(AliyunPasterBaseView)该接口必须调用

    1. AliyunPasterController#setPasterView(AliyunPasterBaseView pasterView);
  • 设置动图恢复的回调

    1. AliyunPasterManager#setOnPasterRestoreListener(OnPasterRestored listener);
  • 移除动图(将动图从UI框架中移除掉)
    1. AliyunPasterController#removePaster();
  • 显示动图(将动图渲染到视频上,并且从UI层面消失)
    1. AliyunPasterController#editCompleted();
  • 隐藏动图(将动图从视频渲染上移除掉,并且显示在UI层面)
    1. AliyunPasterController#editStart();
  • 创建一个贴图View层的预览播放器
    1. AliyunPasterController#createPasterPlayer(TextureView view);
  • 移除动图
    1. AliyunPasterController#removePaster();

    动图/气泡/文字(不使用UI控制器,直接渲染,使用复杂度较高,一般没特殊需求不推荐)

    不使用UI控制器,意味着上层对动图的编辑交互完全要开发者自己实现,对于动图的渲染只需要将动图素材对象及相关的位置大小等信息传递给渲染器。简介:不使用UI控制器添加动图,是指贴图功能使用阿里云SDK提供的一套贴图渲染接口来实现,实际上UI控制器框架内部也是使用这套接口来完成的。涉及核心接口类AliyunIEditor、AliyunPasterManager、AliyunPasterRender。AliyunIEditor——编辑器核心类;AliyunPasterManager——UI控制框架中的贴图/字幕管理器,负责添加贴图;AliyunPasterRender——贴图渲染核心类。使用该接口只完成最后的贴图渲染到视频,至于上层的UI交互逻辑都需要由开发者完成,并且开发者要计算好相应的位置、大小、旋转角度等信息。
  • 获取动图管理器(AliyunPasterManager)
    1. AliyunIEditor#createPasterManager();
  • 获取贴图渲染器(AliyunPasterRender)
    1. AliyunIEditor#getPasterRender();
  • 设置动图显示区域的大小(==必须在AliyunIEditor#init之前调用该接口==)
    1. AliyunPasterRender#setDisplaySize(int width, int height);
    2. AliyunPasterManager#setDisplaySize(int width, int height);
  • 添加动图
    1. AliyunPasterRender#addEffectPaster(EffectPaster paster);
  • 显示动图
    1. AliyunPasterRender#showPaster(EffectPaster paster);
  • 隐藏动图
    1. AliyunPasterRender#hidePaster(EffectPaster paster);
  • 移除动图
    1. AliyunPasterRender#removePaster(EffectPaster paster);
  • 设置贴图保存和恢复的回调
    1. AliyunPasterRender#setOnPasterResumeAndSave(OnPasterResumeAndSave listener);

    静态贴纸

  • 添加静态贴纸
    1. AliyunIEditor#addImage(EffectPicture picture);
  • 移除静态贴纸
    1. AliyunIEditor#removeImage(EffectPicture picture);

    水印

    1. AliyunIEditor#applyWaterMark(String imgPath, float sizeX, float sizeY, float posX, float posY);

    片尾水印

    1. AliyunIEditor#addTailWaterMark(String imagePath, float sizeX, float sizeY, float posX, float posY, long durationUs);

    转场

  • 添加转场配置导入添加视频/照片时可以配置转场信息

  • 更新转场配置更新视频源时可以修改转场信息,并且更新转场信息

    MV

  • 添加MV
    1. AliyunIEditor#applyMV(EffectBean effect);
  • 移除MV
    1. AliyunIEditor#applyMV(null);//设置为null表示移除

    背景音乐/多段配音

  • 添加背景音乐/配音
    1. AliyunIEditor#applyMusic(EffectBean effect);
  • 移除背景音乐/配音
    1. AliyunIEditor#removeMusic(EffectBean effect);
  • 调整背景音乐/配音与原音的比重
    1. AliyunIEditor#applyMusicMixWeight(int id, int weight);
  • 单独调整指定音频流的音量(背景音乐/配音/原音)
    1. AliyunIEditor#applyMusicWeight(int id, int weight);

    时间特效(变速、反复、倒放)

  • 变速
    1. AliyunIEditor#rate(float rate, long startTime, long duration, boolean needOriginDuration);
  • 反复
    1. AliyunIEditor#repeat(int times, long startTime, long duration, boolean needOriginDuration);
  • 倒放
    1. AliyunIEditor#invert();

    特别注意:对于GOP大于5的视频需要先转码,否则将无法倒播。对于视频GOP的检查可以用NativeParser#getMaxGopSize()来获取。转码时将GOP SIZE设置为1,即CropParam#setGop(1);

涂鸦

简介:阿里云短视频SDK内部封装了一套涂鸦接口,包含画板、画笔等概念。整个涂鸦的控制由一个涂鸦控制器——AliyunICanvasController来完成。画板实际上就是涂鸦对应的UI交互View,开发者可以将该View添加到UI交互的ViewGroup中;画笔可以由开发者从外部设置,也可以使用默认内部的画笔,画笔实际上就是一个android.graphics.Paint对象。

  • 获取涂鸦控制器(AliyunICanvasController)
    1. AliyunIEditor#obtainCanvasController(Context context, int w, int h);
  • 获取涂鸦画板View
    1. AliyunICanvasController#getCanvas();
  • 判断是否由涂鸦
    1. AliyunICanvasController#hasCanvasPath();
  • 设置涂鸦渲染到视频上
    1. AliyunICanvasController#applyPaintCanvas();
  • 移除渲染到视频上的涂鸦
    1. AliyunICanvasController#removeCanvas();
  • 撤销上一笔
    1. AliyunICanvasController#undo();
  • 清除画布
    1. AliyunICanvasController#clear();
  • 设置当前画笔颜色
    1. AliyunICanvasController#setCurrentColor(int color);
  • 设置当前画笔的粗细
    1. AliyunICanvasController#setCurrentSize(float size);
  • 设置自定义画笔
    1. AliyunICanvasController#setPaint(Paint paint);
  • 重制涂鸦画板
    1. AliyunICanvasController#resetPaintCanvas();
  • 释放资源
    1. AliyunICanvasController#release();

    合成输出

  • 合成
    1. AliyunIEditor#compose(AliyunVideoParam param, String outputPath, AliyunIComposeCallBack callback);
  • 取消合成
    1. AliyunIEditor#cancelCompose();

    2.4单独的合成上传

    简介:合成上传是阿里云短视频SDK提供的一套单独进行合成上传的功能接口AliyunICompose,利用该接口可以实现编辑完的视频在另外一个界面合成上传。注意:如果是编辑的视频,在创建AliyunICompose实例前,需要先将编辑的特效持久化到本地配置文件中,否则会出现合成的视频没有编辑的特效。
  • 持久化编辑特效
    1. AliyunIEditor#saveEffectToLocal();
  • 初始化合成实例(AliyunICompose)
    1. AliyunComposeFactory#createAliyunCompose();
    2. AliyunICompose#init(Context context);
  • 合成
    1. AliyunICompose#compose(String config, String output, AliyunIComposeCallBack callback);
  • 取消合成
    1. AliyunICompose#cancelUpload();
  • 设置上传重试超时
    1. AliyunICompose#setUploadRetryAndTimeout(int retryCount, int connectTimeoutMills, int readTimeout);
  • 上传注意:这里的上传只能用来上传合成出来的视频文件,如果要上传其他文件,需要用单独的上传接口,但是这种情况下不需要再去单独以来VOD上传库了,因为短视频内部已经包含了,直接使用上传接口即可
    1. AliyunICompose#uploadWithVideoAndImg(String thumbnail,
    2. String accessKeyId,
    3. String accessKeySecret,
    4. String token,
    5. String expiration,
    6. SvideoInfo info,
    7. boolean istranscode,
    8. AliyunIUploadCallBack callback);
  • 刷新STS Token
    1. AliyunICompose#refreshSTSToken(String accessKeyId,
    2. String accessKeySecret,
    3. String token,
    4. String expiration);
  • 取消上传
    1. AliyunICompose#cancelUpload();
  • 继续上传
    1. AliyunICompose#resumeUpload();
  • 暂停上传
    1. AliyunICompose#pauseUpload();
  • 释放资源
    1. AliyunICompose#release();

三、常见问题

  1. 录制时预览画面拉伸变形的问题?答:录制视频的输出分辨率宽高比设置必须保证跟预览所用的GLSurfaceView宽高比一致,否则会自适应GLSurfaceView的宽高比,而导致视频拉伸/压缩变形,这样设计是为了保证所见即所得。

  2. 系统相册和SDK都无法读取视频缩略图且播放页不显示内容?答:缩略图获取使用的是系统API,当视频的色彩编码是4:4:4时,安卓系统API无法无法获取缩略图,且系统播放器也无法正常播放(DEMO中使用的播放器是系统的播放器)。

  3. 系统相册中显示的缩略图跟视频内容不符?答:部分手机系统数据库提供的缩略图是如此的,系统相册显示的缩略图是从系统数据库中获取的。

  4. 视频导入裁剪,缩略图无法获取到?答:目前使用系统API获取缩略图在部分机型上是无法正常获取的,该问题会在后续的版本中优化解决(SDK内部自己实现缩略图的获取替代系统API)

  5. 录制完成后,进入系统相册无法找到录制的视频?答:部分手机的SD卡增加多媒体文件后需要重启手机才会生成新的缩略图信息,如果遇到该问题,只需重启手机即可。

  6. 使用Demo工程打包的Apk,魔法相机的人脸识别不起作用?答:目前工程中使用的人脸识别库是商汤的人脸识别库,由于License已经过期,因此无法正常使用,之所以保留代码是为了给开发者示范如何接入人脸识别库到我们的SDK中,如果用户想要使用人脸识别功能请自行更换人脸识别库。如果用户想要试用带人脸识别的魔法相机功能,请安装官网下载目录中携带的apk安装包。

四、 特殊参数限制说明

参数名称 对应接口或字段 限制说明
视频输出分辨率 录制:MediaInfo.setVideoHeight和MediaInfo.setVideoWidth
裁剪:CropParam.setOutputHeight和CropParam.setOutputWidth
导入合成:AliyunVideoParam.setOutputWidth和AliyunVideoParam.setOutputHeight
录制、裁剪、合成的输出分辨率宽、高不能小于128
视频输出GOP大小 录制:AliyunIRecorder.setGop
裁剪:CropParam.setGop
导入合成:AliyunVideoParam.setGop
Gop大小不能小于帧率的2倍,否则SDK将会默认改为帧率的2倍,也就是Gop最小为2秒
码率计算 裁剪或合成:videoBitrate码率 如果不设置码率或设置码率为0时,码率由视频质量参数来计算得到,如果设置码率则使用该码率参数来编码,码率由用户控制。
本文导读目录