全部产品
视频点播

专业版

更新时间:2017-08-31 17:43:04   分享:   

一、快速开始

1.1 开发环境配置

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

1.2 导入SDK

SDK包括DEMO,AliyunCrop,AliyunRecorder,AliyunEditor,AliyunImport,AliyunVideoSdk,AliyunHelp7个基本moudle,还可能包含其他人脸识别的第三方库,使用时只需要将整个根文件夹作为ANDROID STUDIO的项目导入即可。其中DEMO是作为整个SDK的模块选择界面,AliyunCrop是裁剪模块的示例代码,AliyunRecorder是魔法相机模块的示例代码,AliyunEditor是视频编辑模块的示例代码,AliyunImport是导入模块的示例代码,AliyunHelp是其他模块的示例代码,AliyunVideoSdk是SDK提供的接口。依赖关系为:DEMO依赖AliyunCrop,AliyunRecorder,AliyunEditor,AliyunImport和AliyunHelp。AliyunCrop,AliyunRecorder,AliyunEditor和AliyunImport依赖AliyunVideoSdk。

SDK的文件结构如图所示:

目录结构

SDK的依赖结构如图所示:依赖关系

1.3 权限要求

二、功能使用

2.1 功能分布图

2.2 录制

录制模块功能接口调用顺序图:录制2.2.1初始化参数

使用录制功能,需要初始化AliyunIRecorder对象,初始化方法如下:

  1. AliyunIRecorder recorder = AliyunRecorderCreator.getRecorderInstance(Context context);//参数context为当前页面的上下文
  1. recorder.setDisplayView(GLSurfaceView glSurfaceView);//参数glsurfaceView为用户自己定义的GLSurfaceView及其子类对象

设置视频参数信息:

  1. MediaInfo mediaInfo = new MediaInfo();
  2. mediaInfo.setVideoWidth(TEST_VIDEO_WIDTH);
  3. mediaInfo.setVideoHeight(TEST_VIDEO_HEIGHT);
  4. mediaInfo.setAutoAdjustHWEncoder(true);//硬编时自适应宽高为16的倍数
  5. recorder.setMediaInfo(mediaInfo);

注意:录制时的分辨率是按照GLSurfaceView的实际宽高比,以设置的分辨率的宽为基准生成的,比如用户设置的分辨率是480x480,如果GLSurfaceView的宽高比为9:16,则录制的视频分辨率为480:854,如果想要保持480x480的分辨率,则GLSurfaceView的宽高比要保持1:1。硬编自适应开关如果设为true,则使用硬编(目前只支持硬编)时,如果宽/高不是16的倍数,则会强制转换为16的倍数,这样有一个影响就是传入的分辨率与实际输出分辨率会有一点出入。而如果设置为false,则如果宽/高不是16的倍数,在调用setMediaInfo时将抛出IllegalArgumentException。

2.2.2开始预览&结束预览开始预览如下方法:

  1. void setCamera(CameraType camera); //设置预览的摄像头,前置或者后置
  2. void startPreview();//请将这个函数写在Activity的onResume生命周期中,调用这个函数后将开始预览

结束预览如下方法:

  1. void stopPreview();//请将这个函数写在Activity的onPause生命周期中,调用这个函数后将结束预览

2.2.3开始录制&结束录制

在录制之前,确保已设置录制文件的输出路径,通过AliyunIRecorderoutputPath属性进行设置。

设置传感器角度值,这个必须设置,否则录制的视频角度是错的。

  1. void setRotation(int rotation);

开始录制接口:

  1. void startRecording();

结束录制接口:

  1. void stopRecording();

完成录制接口:

  1. void finishRecording(); //调用完成录制的接口会合并录制的多段视频

生成录制片段信息路径接口(录制的多段视频会序列化到一个json描述文件中,该接口可以返回描述文件的地址,用于编辑等操作)

  1. void finishRecordingForEdit(); //调用接口会生成一个配置文件的Uri

取消录制接口:

  1. void cancelRecording();

2.2.4拍照

  1. /**
  2. * 拍照(从GPU中抓取数据,可以包含特效)
  3. * @param needBitmap 是否需要生成Bitmap
  4. */
  5. void takePhoto(boolean needBitmap);
  6. /**
  7. * 使用系统的拍照接口(不能包含特效)
  8. * @param needBitmap 是否需要生成Bitmap
  9. */
  10. void takePicture(boolean needBitmap);

2.2.5录制变速

  1. void setRate(float rate);//录制变速,速率在0.5-2.0之间

2.2.6录制配乐

  1. void setMusic(String path,long startTime,long duration);//path:音乐文件路径(建议使用aac格式的音频) startTime:音乐开始时间 duration:音乐时长

2.2.7录制静音

  1. void setMute(boolean isMute);//是否需要录制静音,只对麦克风音频有效,请在录制开始前调用

2.2.8开启内置人脸追踪

  1. void needFaceTrackInternal(boolean need);//开启内置人脸

2.2.9设置人脸模型文件夹路径

  1. void setFaceTrackInternalModelPath(String path);//设置内置人脸模型文件夹路径,请将所有人脸模型文件放在同一个文件夹中,文件模型在录制模块demo的assets文件夹中

2.2.10释放资源

Activity销毁时,我们也需要释放录制资源,在destroy中调用:

  1. void destroy();
  2. AliyunRecorderCreator.destroyRecorderInstance();

2.2.11回调接口

录制功能提供了一些回调接口:录制回调

  1. public interface RecordCallback {
  2. /**
  3. * 录制完毕的回调
  4. */
  5. void onComplete(boolean validClip,long clipDuration);
  6. /**
  7. * 合成完毕的回调
  8. * @param outputPath
  9. */
  10. void onFinish(String outputPath);
  11. /**
  12. * 录制进度回调
  13. * @param duration 当前已录制时间
  14. */
  15. void onProgress(long duration);
  16. /**
  17. * 达到最大时长
  18. */
  19. void onMaxDuration();
  20. /**
  21. * 录制错误回调
  22. * @param errorCode
  23. */
  24. void onError(int errorCode);
  25. /**
  26. * 录制初始化回调
  27. */
  28. void onInitReady();
  29. /**
  30. * 该回调后可以调用{@link AliyunIRecorder#startRecording()}接口
  31. */
  32. void onDrawReady();
  33. /**
  34. * 获取当前渲染帧并转成bitmap
  35. * @param bitmap
  36. */
  37. void onPictureBack(Bitmap bitmap);
  38. /**
  39. * 获取当前渲染帧数据
  40. * @param data
  41. */
  42. void onPictureDataBack(byte[] data);
  43. }

采集帧数据回调

  1. public interface OnFrameCallBack {
  2. /**
  3. * 采集帧回调,每采集一帧会通过该接口返回帧数据
  4. * @param bytes
  5. * @param width
  6. * @param height
  7. * @param info
  8. */
  9. void onFrameBack(byte[] bytes,int width,int height,Camera.CameraInfo info);
  10. /**
  11. * 选择预览分辨率的回调
  12. * @param supportedPreviewSizes
  13. * @return
  14. */
  15. Camera.Size onChoosePreviewSize(List<Camera.Size> supportedPreviewSizes, Camera.Size preferredPreviewSizeForVideo);
  16. /**
  17. * 摄像头开启失败
  18. */
  19. void openFailed();
  20. }

纹理ID回调

  1. public interface OnTextureIdCallBack {
  2. /**
  3. * 采集后,渲染处理前的纹理回调
  4. * @param textureId
  5. * @param textureWidth
  6. * @param textureHeight
  7. * @param matrix
  8. * @return
  9. */
  10. int onTextureIdBack(int textureId, int textureWidth, int textureHeight, float[] matrix);
  11. /**
  12. * 经过旋转、裁剪、缩放处理后的纹理回调
  13. * @param scaledId
  14. * @param textureWidth
  15. * @param textureHeight
  16. * @param matrix
  17. * @return
  18. */
  19. int onScaledIdBack(int scaledId,int textureWidth,int textureHeight,float[] matrix);
  20. }

2.2.12前置特效

2.2.12.1 特效操作

录制过程中可以添加效果,这些效果目前包含滤镜,水印,人脸动图三种类型。效果的基类是EffectBase类。三种类型具体对应如下类:EffectFilter—滤镜EffectPaster—贴图EffectImage —静态图片(水印)添加效果的接口:

  1. int addPaster(EffectBase effectBase); // 添加动图效果
  2. int addImage(EffectBase effectBase); // 添加水印效果
  3. int applyFilter(EffectBase effectBase);//添加滤镜效果,如果不需要滤镜,可以将参数置空传入

设置特效信息

  1. void setEffectView(float xRatio,float yRatio,float widthRatio,float heightRatio,EffectBase effectBase);//设置图片的信息(位置,尺寸),其中xRatio,yRatio表示其起始坐标在屏幕中的相对位置百分比,widthRatio,heightRatio表示图片宽高和屏幕宽高的比例值

设置人脸坐标接口:

  1. int setFaces(float[][] faces);//faces参数是包含多个face参数(含义参上)的二维数组,主要用于多人脸追踪,该接口可在采集帧数据回调中对帧数据做人脸识别,识别出人脸坐标后通过该接口传入到SDK内部。

移除效果的接口:

  1. void removePaster(EffectBase effectBase); //删除动图效果
  2. void removeImage(EffectBase effectBase); //删除水印效果

2.2.12.2 控制接口

  1. int switchCamera();//切换摄像头
  2. FlashType switchLight();//循环切换闪光灯模式
  3. boolean setLight(FlashType flashType);//切换为指定闪光灯模式
  4. void setBeautyLevel(int level);//设置美颜度
  5. void setBeautyStatus(boolean on);//设置美颜开/关,true:表示开,false:表示关
  6. void setRotation(int rotation);//设置视频旋转度
  7. void setVideoQuality(VideoQuality quality);//设置视频录制质量

2.4.12.3 其他接口

  1. int getBeautyLevel();//获取当前美颜级别
  2. int getCameraCount();//获取摄像头数量
  3. float getCurrentExposureCompensationRatio();//获取当前曝光度的比例值
  4. String version();//获取接口版本号

2.3 导入裁剪

裁剪模块功能接口调用顺序图:裁剪2.3.1 初始化参数

使用裁剪功能,需要初始化AliyunICrop对象,初始化方法如下:

  1. AliyunICrop crop = AliyunCropCreator.getCropInstance(Context context);//其中context为当前页面的上下文

需要设置裁剪参数:

  1. void setCropParam(CropParam param);

CropParam为裁剪参数类,如下:

  1. public class CropParam {
  2. private String videoPath; //源视频地址
  3. private String outputPath; //输出视频地址
  4. private int outputWidth; //输出宽
  5. private int outputHeight; //输出高
  6. private long startTime; //开始时间
  7. private long endTime; //结束时间
  8. private Rect cropRect; //裁剪区域(cropMode 为CropMode.LB时该参数无效)
  9. private int frameRate = 25; //视频帧率
  10. private int gop = 125; //关键帧间隔
  11. private VideoQuality quality = VideoQuality.HD; //视频质量 VideoQuality.SSD:极高 VideoQuality.HD:高 VideoQuality.SD:中 VideoQuality.LD:低 VideoQuality.PD:非常低 VideoQuality.EPD:极低
  12. private ScaleMode scaleMode; //裁剪模式 ScaleMode.LB:有黑边 ScaleMode.PS:无黑边
  13. private boolean isHWAutoSize = true; //这个变量如果为true(默认为true)则在硬编模式(目前仅支持硬编)下,如果宽/高不是16的倍数,则会自动矫正为16的倍数,这样会导致设置的宽/高与视频实际输出宽/高会有出入,表现出来的效果就是有黑边;如果false,在宽/高不是16的倍数时,则调用setCropParam时将抛出IllegalArgumentException,需要开发者自行处理该异常。
  14. private MediaType mMediaType = MediaType.ANY_VIDEO_TYPE;//媒体文件类型,默认为视频,该参数必须填写,目前支持视频:ANY_VIDEO_TYPE 图片:ANY_IMAGE_TYPE 和 音频:ANY_AUDIO_TYPE
  15. private int mFilmFillColorlColor = Color.BLACK;//填充模式时的填充底色
  16. }

2.3.2 开始裁剪

开始裁剪,接口如下:

  1. int startCrop();

2.3.3 取消裁剪

  1. void cancel();

2.3.4 释放资源

  1. void dispose();

2.3.5 获取视频时长

  1. long getVideoDuration(String videoPath) throws Exception;

2.3.6裁剪音频文件

  1. int startCropAudio(String inputPath,String outputPath,long startTime,long endTime);//inputPath: 音频文件地址 outputPath:裁剪输出地址 startTime:音频开始时间 endTime:音频结束时间

2.3.7 获取接口版本号

  1. String version();

2.4 编辑

编辑接口调用流程2.4.1初始化参数

使用编辑功能,需要初始化AliyunIEditor对象,初始化方法如下:

  1. AliyunIEditor mAliyunEditor = AliyunEditorFactory.creatAliyunEditor(uri);//参数uri为传入的视频片段描述文件地址(该文件可以从录制或者多段导入接口获取)
  2. boolean init(SurfaceView surfaceView);//初始化编辑器

2.4.2视频预览播放

视频预览需要获取播放器,调用如下接口获取一个播放器的实例(注意【视频预览播放】模块的接口如没有特殊说明都是AliyunIPlayer中的接口):

2.4.2.1开始播放

  1. AliyunIPlayer createAliyunPlayer();//创建播放器实例(播放器实例为非线程安全,如需多线程环境使用,需要开发者自己保证线程安全。该接口来自于AliyunIEditor)
  2. void setOnPreparedListener(OnPreparedListener listener);//设置播放器prepare的回调,在播放器onPrepared的回调中调用start()方法播放视频
  3. void start();//开始播视频,该方法务必在onPrepared回调中调用。

关于onPrepared回调,编辑界面特效使用都必须在该回调之后才能使用,在该回调之前使用会有异常。

2.4.2.2停止播放

停止播放调用如下方法:

  1. void stop();//调用这个函数后将停止视频播放

2.4.2.3 seek

  1. /**
  2. * seek到某个时间点
  3. * @param time 时间,单位:毫秒
  4. * @param resumeRequest seek后是否播放 true:播放,false:不播放
  5. */
  6. void seek(long time, boolean resumeRequest);

2.4.2.4 设置播放回调

  1. void setOnPlayCallbackListener(OnPlayCallback listener);
  2. interface OnPlayCallback {
  3. void onPlayStarted();//播放开始时回调
  4. void onError();//播放出错时回调
  5. void onPlayCompleted();//播放完成时回调
  6. }

播放器回调都会post到主线程处理,播放器接口最好也在主线程调用。

2.4.2.5 暂停&恢复

  1. void pause();//暂停播放
  2. void resume();//恢复播放

2.4.2.6 播放器其他功能

  1. long getCurrentPosition();//获取当前视频进度
  2. long getDuration();//获取视频总时长
  3. boolean isPlaying();//获取视频状态,是否在播放中
  4. int getVideoWidth();//获取原始视频的宽度,如果有多段视频则取第一段视频的宽度
  5. int getVideoHeight();//获取原始视频的高度,如果有多段视频则取第一段视频的高度
  6. boolean isAudioSilence();//判断视频是否处于静音状态
  7. void setAudioSilence(boolean silence);//设置视频静音或解除静音
  8. void setVolume(int volume);//设置视频音量
  9. void setDisplayMode(VideoDisplayMode mode);//设置视频填充模式 mode取值VideoDisplayMode.FILL 截断填充,铺满展示区域,多出的部分裁掉,V ideoDisplayMode.SCALE 黑边填充按视频比例全部展示到展示区域,无法铺满的 部分填充黑边
  10. void setFillBackgroundColor(int color);//设置填充颜色,只有在{@link AliyunIPlayer#setDisplayMode(VideoDisplayMode)}为{@link VideoDisplayMode#FILL}时才有效

播放器状态及生命周期图:play_self_life

2.4.3 特效编辑

使用特效之前确保播放器已经就绪,处于onPrepared的状态。可以使用的特效主要有滤镜,贴纸,字幕,音乐,MV,水印。其中贴纸,字幕有交互需求,SDK提供了两种使用方式。除贴纸,字幕外的其他特效均使用AliyunIEditor接口添加滤镜,音乐,MV三种特效均使用特效类EffectBean

2.4.3.1 应用滤镜特效

  1. /**
  2. * 使用滤镜效果
  3. * @param effect 特效资源的路径及ID
  4. * @return EFFECTNOTPAY,
  5. * EFFECTUSEFAILED,
  6. * EFFECTUSESUCCESS
  7. */
  8. int applyFilter(EffectBean effect);

2.4.3.2 应用MV特效

  1. /**
  2. * 使用mv效果
  3. * @param effect 特效资源的路径及ID
  4. * @return EFFECTNOTPAY,
  5. * EFFECTUSEFAILED,
  6. * EFFECTUSESUCCESS
  7. */
  8. int applyMV(EffectBean effect);

2.4.3.3 应用音乐特效

  1. /**
  2. * 使用music效果
  3. * @param effect 特效资源的路径及ID
  4. * @return EFFECTNOTPAY,
  5. * EFFECTUSEFAILED,
  6. * EFFECTUSESUCCESS
  7. */
  8. int applyMusic(EffectBean effect);

2.4.3.2 应用水印特效

  1. int applyWaterMark(String imgPath, float sizeX, float sizeY, float posX, float posY);//传入水印图片的路径,sizeX 水平方向上水印相对展示区域的比例,sizeY竖直方向上水印相对展示区域的比例,posX 水印位置在水平方向上相对展示区域的比例, posY 水印位置在竖直方向上相对展示区域的比例

水印接口调用示例

  1. File waterMark = new File("/sdcard/QUEditorDemo/tail/qupai-logo2.png");
  2. if (waterMark.exists()) {
  3. Bitmap wmBitmap = BitmapFactory.decodeFile("/sdcard/QUEditorDemo/tail/qupai-logo2.png");
  4. if (wmBitmap != null) {
  5. //水印例子 水印的大小为 :水印图片的宽高和显示区域的宽高比,注意保持图片的比例,不然显示不完全 水印的位置为 :以水印图片中心点为基准,显示区域宽高的比例为偏移量,0,0为左上角,1,1为右下角
  6. mAliyunEditor.applyWaterMark("/sdcard/QUEditorDemo/tail/qupai-logo2.png", (float)wmBitmap.getWidth() / mGlSurfaceView.getWidth(), (float) wmBitmap.getHeight() / mGlSurfaceView.getHeight(), 1f - (float) wmBitmap.getWidth() / mGlSurfaceView.getWidth() / 2, 0f + (float) wmBitmap.getHeight() / mGlSurfaceView.getHeight() / 2);
  7. }
  8. }

2.4.3.3 设置混音权重

  1. int applyMusicMixWeight(int weight);

一般在使用了音乐或MV后调用,如果没有音乐资源则调用该接口无效。

2.4.3.4 贴纸&字幕&文字

贴纸和字幕拥有编辑可选项,与其他特效有所不同,可以有两种方法来操作:方法一:带交互逻辑的贴纸和字幕编辑操作使用AliyunPasterManager和AliyunPasterController完成。方法二:不带交互逻辑的贴纸和字幕编辑操作使用AliyunPasterRender接口完成。(实际上方法二内部也是使用的AliyunPasterRender)如果开发者想要使用默认编辑交互行为,则可以使用第一种带交互逻辑的接口来进行;如果第一种方法的交互行为无法满足开发者的需要,则可以使用第二种方法,使用AliyunPasterRender来进行贴纸和字幕的编辑,渲染工作。而实际的交互行为由开发者自己定义开发。

使用方法一:编辑需求的贴纸,字幕添加,首先获取AliyunPasterManager的实例:

  1. AliyunPasterManager createPasterManager();//通过AliyunIEditor对象调用该方法获取

AliyunPasterManager的主要接口:

  1. AliyunPasterController addPaster(String path);//添加普通贴纸
  2. AliyunPasterController addPasterWithStartTime(String path, long startTime, long duration);//添加贴纸并传入时长和开始时间
  3. AliyunPasterController addSubtitle(String text, String font);//添加文字贴纸,并传入文字所使用的字体文件路径
  4. AliyunPasterController addSubtitleWithStartTime(String text, String font, long sta tTime, long duration);//添加文字贴纸,传入文字所使用的字体文件的路径,并传入开始时间和时长
  5. void setDisplaySize(int width, int height);//设置贴纸展示区域的大小
  6. void setOnPasterRestoreListener(OnPasterRestored listener);//设置贴纸恢复的回调

获取AliyunPasterManager对象后,需要设置动图展示区域的大小,如果不设置,默认为屏幕的宽为边长的正方形区域,设置后才能正确的计算出贴纸在展示区域内正确的大小和位置。使用贴纸后会返回AliyunPasterController对象,AliyunPasterController定义了贴纸的位置,大小等相关信息,可以通过get方法获取,它也提供了贴纸编辑的一些接口,比如移除贴纸,设置贴纸时间,通知贴纸开始编辑及结束编辑。AliyunPasterManager贴纸编辑添加MVC设计示意图:贴图MVC

从上面的示意图中我们看到AliyunPasterManager负责创建控制器AliyunPasterController对象,控制器中定义了AliyunPasterBaseView接口来获取上层UI的状态,开发者可以实现AliyunPasterBaseView接口,并且通过该接口将UI交互行为产生的数据变动传递给控制器,控制器再同步UI状态到渲染层,从而完成了贴纸的编辑渲染,通过这种方式,开发者可以不需要关心内部业务细节而只关心UI交互。

使用方法二:无编辑需求的贴图使用,首先获取AliyunPasterRender接口:

  1. AliyunPasterRender getPasterRender();//通过AliyunIEditor接口获取

获取到AliyunPasterRender对象后同样的需要设置展示区域的大小和贴图恢复和保存的回调:

  1. void setDisplaySize(int width, int height);
  2. void setOnPasterResumeAndSave(OnPasterResumeAndSave listener);

AliyunPasterRender的主要接口:

  1. int addSubtitle(Bitmap bmp, EffectText subtitle);
  2. int addEffectPaster(EffectPaster paster);
  3. int addCaptionPaster(Bitmap bmp, EffectCaption caption);

EffectPaster为贴图的基类,EffectText扩展了EffectPaster,添加了文字相关的属性,EffectCaption又扩展了EffectPaster,添加了文字与贴图的关系描述。使用接口时需要自己构造贴图描述对象,主要描述有贴图的宽高,中心点位置,旋转角度,是否镜像,开始结束时间,名称,id等

删除隐藏及显示

  1. void removePaster(EffectPaster paster);
  2. void hidePaster(EffectPaster paster);
  3. void showPaster(EffectPaster paster);
  4. void showTextPaster(Bitmap bmp, EffectText text);
  5. void showCaptionPaster(Bitmap bmp, EffectCaption caption);

2.4.3.5 涂鸦

涂鸦功能提供了涂鸦控制器AliyunICanvasController,通过涂鸦控制器,开发者可以拿到画板(View)和画笔,画板是一个View,开发者可以将其动态添加到布局中,画笔用来设置各种属性。

获取涂鸦控制器AliyunICanvasController

  1. AliyunICanvasController obtainCanvasController(Context context, int w, int h);

以下涂鸦部分接口均来自AliyunICanvasController

  1. View getCanvas();//获取涂鸦板
  2. void removeCanvas();//清除渲染到视频的涂鸦
  3. void undo();//撤销上一笔操作
  4. void clear();//清空画板
  5. void setPaint(Paint paint);//设置自定义画笔
  6. void setCurrentColor(int color);//设置当前画笔颜色
  7. void setCurrentSize(float size);//设置当前画笔粗细
  8. int applyPaintCanvas();//设置涂鸦
  9. int resetPaintCanvas();//重新渲染涂鸦,这里与resetPaintCanvas不同的是不需要重新生成中间文件,而是直接渲染,该接口必须在执行过applyPaintCanvas之后调用

2.4.4视频合成导出

获取导出实例,在AliyunIEditor中调用:

  1. AliyunIExporter getExporter();

获取AliyunIExporter对象后设置片尾水印(可选),然后启动合成,传入合成回调及输出地址,中途可以取消合成。主要接口如下:

  1. /**
  2. * 添加片尾水印
  3. * @param imgPath 水印图片地址
  4. * @param sizeX 水印图片横向大小
  5. * @param sizeY 水印图片纵向大小
  6. * @param posX 水印图片横向位置(-1,1)
  7. * @param posY 水印图片纵向位置(-1,1)
  8. */
  9. void setTailWatermark(String imgPath, float sizeX, float sizeY, float posX, float posY);
  10. /**
  11. * 清除片尾水印
  12. */
  13. void clearTailWatermark();
  14. /**
  15. * 开始导出合成
  16. * @param outputPath
  17. * @param callback
  18. */
  19. void startCompose(String outputPath, OnComposeCallback callback);


  20. /**
  21. * 取消导出合成
  22. */
  23. void cancel();

调用导出后播放器的一些功能将不能使用,如start,stop,seek,pause,resume等,必须在导出完成或者取消后才可以继续调用。

2.4.5导出回调接口

导出功能提供了一些回调接口:

导出回调

  1. public interface OnComposeCallback {
  2. void onError();
  3. void onComplete();
  4. void onProgress(int progress);
  5. }

2.4.6其他接口

AliyunIEditor还提供了获取视频缩略图的工具接口AliyunIThumbnailFetcher,用于自定义视频导航条,其实例可以通过AliyunIEditor.getAliyunThumbnailFetcher方法获取,AliyunIThumbnailFetcher主要方法有:

  1. 首先添加视频源(支持多端视频)
  2. void addVideoSource(String path);//添加视频源, path表示视频路径
  3. void fromConfigJson(String jsonPath);//从配置文件加载视频信息(适用于SDK内操作产生的project.json)

设置取帧参数

  1. /**
  2. * 设置输出大小,该方法必须在{@link AliyunIThumbnailFetcher#requestThumbnailImage(long[], OnThumbnailCompletion, int)}
  3. * 前面调用,否则会抛出{@link IllegalStateException}
  4. * @param width 输出宽度
  5. * @param height 输出高度
  6. * @param mode 裁剪模式 (目前可以忽略,填任意值,所有的都是从中间裁剪)
  7. * @param scaleMode 缩放模式 (目前可以忽略,填任意值,只支持裁剪模式,不支持填充模式)
  8. * @param cacheSize 缓存大小,即缓存的缩略图数量,缓存的图片不需要重新解码取
  9. * @return
  10. */
  11. int setParameters(int width, int height,
  12. CropMode mode, ScaleMode scaleMode,
  13. int cacheSize);
  14. /**
  15. * 通过请求id取消该id所标识的请求,该方法不保证一定成功,会返回取消成功的标识
  16. * @param id 要取消的缩略图请求的ID
  17. * @return true 取消成功, false 取消失败
  18. */
  19. boolean cancelThumbnailRequest(int id);
  20. /**
  21. * 传入时间点获取该时间点的视频缩略图,并通过回调返回结果
  22. * @param time 时间点,单位毫秒
  23. * @param callback 获取缩略图结果的回调
  24. * @return 返回该次请求的ID
  25. */
  26. int requestThumbnailImage(long time, int width, int height, OnThumbnailCompl etion callback, int cacheSize);
  27. /**
  28. * 获取总时长,单位是毫秒
  29. * @return
  30. */
  31. long getTotalDuration();

缩略图获取的回调:

  1. interface OnThumbnailCompletion {
  2. void onThumbnailReady(ShareableBitmap frameBitmap, long time);
  3. }

2.5 多段导入

2.5.1 初始化参数

使用导入编辑功能,需要初始化AliyunIImport对象,初始化方法如下:

  1. AliyunImportCreator.getImportInstance(Context context);//其中context建议传入Application Context

设置视频输出参数:

  1. void setVideoParam(AliyunVideoParam param);

AliyunVideoParam为视频输出参数类,如下:

  1. public class AliyunVideoParam {
  2. private int mFrameRate; //输出帧率
  3. private int mGop; //关键帧间隔(单位为帧数)
  4. private int mOutputWidth; //输出视频宽
  5. private int mOutputHeight;//输出视频高
  6. private VideoQuality mVideoQuality = VideoQuality.HD; //输出视频质量,分为极高,高,中,低
  7. private ScaleMode mScaleMode = ScaleMode.LB; //裁切模式,LB为视频显示完全,多出的部分填充黑边,PS为不填充黑边,假如视频放不下则裁切视频以适应区域
  8. private boolean isHWAutoSize = true;//这个变量如果为true(默认为true)则在硬编模式(目前仅支持硬编)下,如果宽/高不是16的倍数,则会自动矫正为16的倍数,这样会导致设置的宽/高与视频实际输出宽/高会有出入,表现出来的效果就是有黑边;如果false,在宽/高不是16的倍数时,则调用setVideoParam时将抛出IllegalArgumentException,需要开发者自行处理该异常。
  9. }

2.5.2 添加要合成的视频添加视频,接口如下:

  1. int addVideo(String videoPath, long fadeDuration, AliyunDisplayMode mode);

2.5.3 添加要合成的图片添加图片,接口如下:

  1. int addImage(String imagePath, long fadeDuration, long duration, AliyunDisplayMode mode);

2.5.4 移除视频

  1. void removeVideo(String videoPath);

2.5.5 更换视频顺序

  1. void swap(int pos1, int pos2);

2.5.6 生成可编辑的配置

  1. String generateProjectConfigure();

2.5 视频取帧工具.可取非关键帧

开发者可以通过AliyunThumbnailFetcherFactory.createThumbnailFetcher()获取一个AliyunIThumbnailFetcher的实例。目前跟编辑界面取帧工具是是个接口类.首先添加视频源(支持多端视频)

  1. void addVideoSource(String path);//添加视频源, path表示视频路径
  2. void fromConfigJson(String jsonPath);//从配置文件加载视频信息(适用于SDK内操作产生的project.json)

设置取帧参数

  1. /**
  2. * 设置输出大小,该方法必须在{@link AliyunIThumbnailFetcher#requestThumbnailImage(long[], OnThumbnailCompletion, int)}
  3. * 前面调用,否则会抛出{@link IllegalStateException}
  4. * @param width 输出宽度
  5. * @param height 输出高度
  6. * @param mode 裁剪模式 (目前可以忽略,填任意值,所有的都是从中间裁剪)
  7. * @param scaleMode 缩放模式 (目前可以忽略,填任意值,只支持裁剪模式,不支持填充模式)
  8. * @param cacheSize 缓存大小,即缓存的缩略图数量,缓存的图片不需要重新解码取
  9. * @return
  10. */
  11. int setParameters(int width, int height,
  12. CropMode mode, ScaleMode scaleMode,
  13. int cacheSize);

其他接口

  1. /**
  2. * @param time 一组时间点,单位毫秒
  3. * @param callback 获取缩略图结果的回调
  4. * @return 返回该次请求的ID
  5. */
  6. int requestThumbnailImage(long[] time, OnThumbnailCompletion callback, int cacheSize);
  7. void release();//释放资源
  8. long getTotalDuration();//获取总时长,单位是毫秒

三、常见问题

  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秒
硬编分辨率16数适配 录制:MediaInfo.setHWAutoSize
裁剪:CropParam.setHWAutoSize
导入合成:AliyunVideoParam.setHWAutoSize
开启硬编模式(目前只有硬编)后,视频输出分辨率必须为16倍数,如果isHWAutoSize设置为true,则SDK会对于非16倍数的宽/高自动做矫正,这样会导致最终输出的视频与开发者设置的分辨率不会完全匹配,会有一点黑边,如果isHWAutoSize为false,则对于非16倍数的宽/高,SDK将在对应的参数设置接口抛出IllegalArgumentsException的异常,由开发者自行处理该问题。
本文导读目录
本文导读目录
以上内容是否对您有帮助?