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

标准版

更新时间:2018-02-11 10:13:00

一、快速开始

1.1 开发环境配置

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

1.2 Demo集成

  • 1.2.1 Demo工程结构标准版目录结构

  • 1.2.2 Demo讲解

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

    Demo的依赖结构如图所示:

    标准版依赖关系

1.3 导入SDK

  • 1.3.1 导入aar将sdk目录中提供的AliyunSdk-RCE.aar以module的方式添加到工程中,如下图所示:add aar module1add aar module 2然后在自己的app module中添加对该module的依赖,如下:app中添加对AAR module的依赖

  • 1.3.2 导入.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. liblive-openh264.so-----------------编码相关的库(必须load
    2. libQuCore.so------------------------SDK核心库(必须load
    3. libQuCore-ThirdParty.so-------------SDK依赖的第三方库(必须load
    4. libaliresample.so-------------------音频重采样相关的库(不需要可以去掉)

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

    1. System.loadLibrary("live-openh264");
    2. System.loadLibrary("QuCore-ThirdParty");
    3. System.loadLibrary("QuCore");
  • 1.3.4 添加对第三方库的依赖在开发者工程module的build.gradle中添加对第三方库的依赖

    1. compile 'com.google.code.gson:gson:2.8.0' ----Gson
    2. compile 'com.squareup.okhttp3:okhttp:3.2.0' ----OkHttp
    3. compile 'com.aliyun.dpa:oss-android-sdk:2.4.4' ----阿里云OSS上传库,如果不需要使用内部的VOD上传库可以不加这个依赖
  • 1.3.5 初始化相关配置

    在App的Application类onCreate方法中调用

    1. 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下的混淆配置文件,然后将其中的配置信息拷贝到自己项目的混淆配置中即可

混淆配置路径

二、功能使用

2.1 录制

录制模块功能接口调用顺序图:录制2.1.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.1.2开始预览&结束预览开始预览如下方法:

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

结束预览如下方法:

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

2.1.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.1.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.1.5录制变速

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

2.1.6录制配乐

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

2.1.7录制静音

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

2.1.8释放资源

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

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

2.1.9回调接口

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

  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.1.10前置特效

2.1.10.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.1.10.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);//设置视频录制质量
  8. void setVideoBitrate(int bitrate);//设置视频码率,如果不设置则使用视频质量videoQulity参数计算出码率

2.1.10.3 其他接口

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

2.2 导入裁剪

裁剪模块功能接口调用顺序图:裁剪2.2.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 int mVideoBitrate; //视频码率
  12. private VideoQuality quality = VideoQuality.HD; //视频质量 VideoQuality.SSD:极高 VideoQuality.HD:高 VideoQuality.SD:中 VideoQuality.LD:低 VideoQuality.PD:非常低 VideoQuality.EPD:极低
  13. private ScaleMode scaleMode; //裁剪模式 ScaleMode.LB:有黑边 ScaleMode.PS:无黑边
  14. private boolean isHWAutoSize = true; //这个变量如果为true(默认为true)则在硬编模式(目前仅支持硬编)下,如果宽/高不是16的倍数,则会自动矫正为16的倍数,这样会导致设置的宽/高与视频实际输出宽/高会有出入,表现出来的效果就是有黑边;如果false,在宽/高不是16的倍数时,则调用setCropParam时将抛出IllegalArgumentException,需要开发者自行处理该异常。
  15. private MediaType mMediaType = MediaType.ANY_VIDEO_TYPE;//媒体文件类型,默认为视频,该参数必须填写,目前支持视频:ANY_VIDEO_TYPE 图片:ANY_IMAGE_TYPE 和 音频:ANY_AUDIO_TYPE
  16. private int mFilmFillColorlColor = Color.BLACK;//填充模式时的填充底色
  17. private boolean isUseGPU = false;//是否使用GPU
  18. }

2.2.2 开始裁剪

开始裁剪,接口如下:

  1. int startCrop();

2.2.3 取消裁剪

  1. void cancel();

2.2.4 释放资源

  1. void dispose();

2.2.5 获取视频时长

  1. long getVideoDuration(String videoPath) throws Exception;

2.2.6裁剪音频文件

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

2.2.7 获取接口版本号

  1. String version();

2.3 编辑

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

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

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

2.3.2视频预览播放

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

2.3.2.1开始播放

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

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

2.3.2.2停止播放

停止播放调用如下方法:

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

2.3.2.3 seek

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

2.3.2.4 设置播放回调

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

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

2.3.2.5 暂停&恢复

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

2.3.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.3.3 特效编辑

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

2.3.3.1 应用滤镜特效

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

**2.3.3.2 添加特效滤镜

  1. /**
  2. * 添加动效滤镜,同一个时间区间内只能有一个动销滤镜,如果添加两个时间冲 * 突了,则冲突的时间段,新添加的会覆盖之前添加的
  3. * @param filter
  4. * @return 成功返回 {@link com.aliyun.querrorcode.AliyunErrorCode#OK},失败返回错误码
  5. * {@link com.aliyun.querrorcode.AliyunErrorCode#ERROR_INVALID_ARGUMENTS}--参数无效,比如duration < 0
  6. // * {@link com.aliyun.querrorcode.AliyunErrorCode#ERROR_CONFLICT_TIME_INTERVAL}--跟其他动效滤镜的时间区间有冲突
  7. */
  8. int addAnimationFilter(EffectFilter filter);

2.3.3.3 移除动效滤镜

  1. /**
  2. * 移除动效滤镜
  3. * @param filter
  4. */
  5. void removeAnimationFilter(EffectFilter filter);

2.3.3.4 清除所有动效滤镜

  1. /**
  2. * 移除所有动效滤镜
  3. */
  4. void clearAllAnimationFilter();

2.3.3.5 应用音乐特效

  1. /**
  2. * 使用music效果
  3. * 音乐作用时间可以选择,时间设置
  4. * @see EffectBean
  5. * @param effect 特效资源的路径及ID
  6. * @return 成功返回0,失败返回ErrorCode
  7. */
  8. int applyMusic(EffectBean effect);

音乐特效支持设置作用时间长度,EffectBean 有startTime和duration字段,用于支持音乐时间选择。

2.4.3.6 应用水印特效

  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.7 设置混音权重

  1. int applyMusicMixWeight(int weight);

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

2.4.3.8 设置视频过渡动画时间长度

  1. int setClipFadeDurationAndAnimation(int index, long fadeDuration, int inAnimation, int outAnimation);

接口说明:指定视频索引添加过渡时长,当索引为0时为第一段视频添加过渡时长,此时过渡动画将从第一段的开头起算,只在第一段视频开头起作用,不会影响其他视频段。当索引大于0且不大于视频总数时,该过渡时间作用于上一段视频的结束和本段视频的开始,即上一段视频的结尾和本段视频的开头重叠在一起,重叠的时间长度为该过渡时长。因为sdk音频混流的限制,过渡时间长度最大不能超过最小时长视频时间长度的一半。保证过渡时间内只有两个视频在播放状态。过渡动画暂时没有支持可选择,只有淡入和淡出效果,参数目前都传0即可

2.4.3.9 涂鸦

涂鸦功能提供了涂鸦控制器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.3.10 静态贴纸

添加一张图片

  1. int addImage(EffectPicture picture);

移除一张图片

  1. void removeImage(EffectPicture picture);

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

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

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

新增选择添加视频的时间区间,接口如下:

  1. int addVideo(String videoPath, long startTime,long endTime,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. void addVideoSource(String path,long startTime,long endTime);

设置取帧参数

  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();//获取总时长,单位是毫秒

2.6 导出上传

由于该功能依赖了阿里云OSS上传SDK,如果要使用该功能,需要开发者在自己的工程中添加对阿里云OSS上传SDK的依赖,且版本不能低于2.4.4,如下:

  1. compile 'com.aliyun.dpa:oss-android-sdk:2.4.4'

该接口可以实现脱离编辑页面的合成导出,并且可以直接使用导出的视频上传到点播服务

数据流程(关于STS Token的获取可以参考1.6概念介绍中关于STS的):上传数据流程

AliyunICompose接口说明(详细说明请参考SDK压缩包内的java docs):

  1. 1、初始化
  2. AliyunICompose.init
  3. 2、合成
  4. int compose(String config, String output, AliyunIComposeCallBack callback);
  5. 3、取消合成
  6. int cancelCompose();
  7. 4、上传
  8. int uploadWithVideoAndImg(String thumbnail,String accessKeyId,String accessKeySecret,String token,String expiration,SvideoInfo info,boolean istranscode,AliyunIUploadCallBack callback);
  9. 5、暂停上传
  10. void pauseUpload();
  11. 6、继续上传
  12. void pauseUpload();
  13. 7、刷新STS Token信息(开发者从APP Server获取新的STS token通过该接口更新给短视频SDK)
  14. int refreshSTSToken(String accessKeyId,String accessKeySecret,String token,String expiration);
  15. 8、取消上传
  16. int cancelUpload();
  17. 9、释放资源
  18. void release();

三、上传

  • 3.1 使用短视频SDK内部包含的上传SDK

短视频SDK内部包含了阿里云VOD上传SDK,但是没有添加阿里云OSS上传SDK的依赖,由于阿里云VOD上传SDK依赖了OSS上传SDK,因此如果要使用短视频内部包含的VOD上传,需要开发者在app工程中手动添加OSS上传SDK的依赖,且版本不能低于2.4.4,如下:。由于该功能依赖了阿里云OSS上传SDK,如果要使用该功能,需要开发者在自己的工程中添加对阿里云OSS上传SDK的依赖,且版本不能低于2.4.4,如下:

  1. compile 'com.aliyun.dpa:oss-android-sdk:2.4.4'
本文导读目录