全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
视频点播

标准版

更新时间:2018-01-12 10:06:10

一、快速开始

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();

三、上传

  • 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'
本文导读目录