王者地带
王者地带
  • 发布:2018-06-20 16:35
  • 更新:2020-04-27 19:07
  • 阅读:10737

分享 Android Studio 离线打包 阿里云 短视频 SDK 基础版

分类:HTML5+

离线打包一些第三方的SDK, 犹如一名战士穿上铠甲,大大增强了战斗力,让你的APP 功能变得更加强大。

Android Studio 离线打包 阿里云 短视频 SDK 基础版

1.基础版: 只有录制和裁剪功能,

  1. 标准版:可以修改UI
  2. 专业版: 很复杂的功能
    可以参考,阿里云SDK说明
    阿里云短视频基础版

如何没有离线打包过的,可以参考,官方最新的AS 打包教程:
AS 最新离线打包教程


扫一扫下载安卓dome体验

里云的SDK包 QuSdk-RC.aar 复制到 libs/ 目录下,和 armeabi-v7a 文件夹复制到 libs/ 下里面是些os文件。

第二步:添加 阿里云 的依赖,在build.gradle ,文件 dependencies 里添加,

implementation(name: 'QuSdk-RC', ext: 'aar')  
    compile 'com.android.support:appcompat-v7:24.2.1'  
    compile 'com.android.support:design:24.2.1'  
    compile 'com.google.code.findbugs:jsr305:3.0.0'  
    compile 'com.github.bumptech.glide:glide:3.7.0'  
    compile 'pub.devrel:easypermissions:0.2.1'  
    compile 'com.squareup.okhttp3:okhttp:3.2.0'  
    compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'  
    compile 'com.squareup.okio:okio:1.12.0'  
    compile 'com.google.code.gson:gson:2.8.0'

然后再在 在build.gradle 文件里和 dependencies 同级别 处添加

repositories {  
    flatDir {  
        dirs 'libs'  
    }  
}  

然后再在 在build.gradle 文件里android 处添加

 sourceSets.main {  
        jni.srcDirs = []  
        jniLibs.srcDir "libs"  
    }

然后在设置AndroidManifest.xml文件,声明使用权限(必须)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
<uses-permission android:name="android.permission.CAMERA" />  
<uses-permission android:name="android.permission.FLASHLIGHT" />  
<uses-permission android:name="android.permission.RECORD_VIDEO" />  
<uses-permission android:name="android.permission.RECORD_AUDIO" />  
<uses-permission android:name="android.permission.INTERNET" />  
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

第三步:以上权限,和SDK 的一些配置,已经配好了,下面进入写代码:
基础版的,代码很少,也简单,目前写两个java文件,一个用于初始化,别一个用于调用录制

要用视频录制,先初始化阿里云 短视频组件,
写了一个 :AliyunServer 类, 然在 dcloud_properties.xml ,services 服务项,添加一行,用于,应用打开时,就执行该文件,用于初始化阿里云 短视频组件

<service name="AliyunServer" value="com.Video.integrate.AliyunServer"/>

基础版,只需要添加这三行就可以。

package com.Video.integrate;  

import android.content.Context;  
import android.os.Bundle;  

import com.aliyun.common.httpfinal.QupaiHttpFinal;  

import io.dcloud.common.DHInterface.StandardFeature;  

/**  
 * Created by Administrator on 2018-06-20.  
 */  

public class AliyunServer extends StandardFeature  
{  
    public void onStart(Context pContext, Bundle pSavedInstanceState, String[] pRuntimeArgs) {  
        /**  
         * 如果需要在应用启动时进行初始化,可以继承这个方法,并在properties.xml文件的service节点添加扩展插件的注册即可触发onStart方法  
         * */  

        //当应用打开时,初始化,阿里SDK短视频 组件  
        System.loadLibrary("QuCore-ThirdParty");  
        System.loadLibrary("QuCore");  
        QupaiHttpFinal.getInstance().initOkHttpFinal();  
    }  
}  

第二步就是:AliyunVideo 类,用于调起录制页面

package com.Video.integrate;  

import android.app.Activity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.view.Window;  

import com.aliyun.demo.recorder.AliyunVideoRecorder;  
import com.aliyun.struct.common.CropKey;  
import com.aliyun.struct.common.ScaleMode;  
import com.aliyun.struct.common.VideoQuality;  
import com.aliyun.struct.recorder.CameraType;  
import com.aliyun.struct.recorder.FlashType;  
import com.aliyun.struct.snap.AliyunSnapVideoParam;  

import org.json.JSONException;  
import org.json.JSONObject;  

public class AliyunVideo extends Activity  
{  
    private static final int REQUEST_CODE_RECORD_VIDEO= 1002;  
    private int resolutionMode,ratioMode,recordMode,beautyLevel,max,min,gop,minVideoDuration,maxVideoDuration,minCropDuration,frameRate,resulutionMode;  
    private boolean beautyStatus,needClip,needRecord;  
    private CameraType cameraType;  
    private FlashType flashType;  
    private VideoQuality videoQulity;  
    private ScaleMode cropMode;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);  
        Intent intent = this.getIntent();  
        String datajson= intent.getCharSequenceExtra("datajson").toString();  
        try {  
        JSONObject object=new JSONObject(datajson);  
        String _resolutionMode=object.getString("setResolutionMode");  
               resolutionMode=onRESOLUTION(_resolutionMode);  
        String _setRatioMode=object.getString("setRatioMode");  
             if(_setRatioMode.equals("1/1")){  
                ratioMode = AliyunSnapVideoParam.RATIO_MODE_1_1;  
            }else if(_setRatioMode.equals("3/4")){  
                ratioMode = AliyunSnapVideoParam.RATIO_MODE_3_4;  
            }else if(_setRatioMode.equals("9/16")){  
                ratioMode = AliyunSnapVideoParam.RATIO_MODE_9_16;  
            }  
        String _setRecordMode=object.getString("setRecordMode").trim().toLowerCase();  
            if(_setRecordMode.equals("auto")){  
                recordMode=AliyunSnapVideoParam.RECORD_MODE_AUTO;  
            }else if(_setRecordMode.equals("press")){  
                recordMode= AliyunSnapVideoParam.RECORD_MODE_PRESS;  
            }else if(_setRecordMode.equals("touch")){  
                recordMode= AliyunSnapVideoParam.RECORD_MODE_TOUCH;  
            }  
            beautyLevel=object.getInt("setBeautyLevel");  
            beautyStatus=object.getBoolean("setBeautyStatus");  
            String _cameraType=object.getString("setCameraType").trim().toLowerCase();  
            if(_cameraType.equals("front"))  
            {  
                cameraType=CameraType.FRONT;  
            //    Log.i("KPPPPPPPPFGGGGGGGGG", _cameraType);  
            } else{cameraType=CameraType.BACK;}  
            String _flashType=object.getString("setFlashType").trim().toLowerCase();  
            if(_flashType.equals("no")){  
                flashType=FlashType.ON;  
            }else if(_flashType.equals("off")){  
                flashType= FlashType.OFF;  
            }else if(_flashType.equals("auto")){  
                flashType= FlashType.AUTO;  
            }  
            needClip=object.getBoolean("setNeedClip");  
            max=object.getInt("setMaxDuration")*1000;  
            min=object.getInt("setMinDuration")*1000;  
            String _videoQuality=object.getString("setVideoQuality").trim().toLowerCase();  
            if(_videoQuality.equals("ld")){  
                videoQulity = VideoQuality.LD;  
            }else if(_videoQuality.equals("sd")){  
                videoQulity = VideoQuality.SD;  
            }else if(_videoQuality.equals("hd")){  
                videoQulity = VideoQuality.HD;  
            }else if(_videoQuality.equals("ssd")){  
                videoQulity = VideoQuality.SSD;  
            }  
            gop=object.getInt("setGop");  
            minVideoDuration=object.getInt("setMinVideoDuration")*1000;  
            maxVideoDuration=object.getInt("setMaxVideoDuration")*1000;  
            minCropDuration=object.getInt("setMinCropDuration")*1000;  
            frameRate=object.getInt("setFrameRate");  
            needRecord=object.getBoolean("setNeedRecord");  
            String _resulutionMode=object.getString("setResulutionMode");  
            resulutionMode=onRESOLUTION(_resulutionMode);  
            String _cropMode=object.getString("setCropMode").trim().toLowerCase();  
            cropMode=(_cropMode.equals("cpu")?ScaleMode.PS:ScaleMode.LB);  
        } catch (JSONException e){  
            e.printStackTrace();  
        }  

        AliyunSnapVideoParam recordParam=new AliyunSnapVideoParam.Builder()  
                .setResolutionMode(resolutionMode) //录制 设置录制分辨率,目前支持360p,480p,540p,720p  
                .setRatioMode(ratioMode)  //录制 设置视频比例,目前支持1:1,3:4,9:16  
                .setRecordMode(recordMode) //录制 设置录制模式,目前支持按录,点录和混合模式  
                //  .setFilterList(eff_dirs)  //录制 设置滤镜地址列表,具体滤镜接口接收的是一个滤镜数组  
                .setBeautyLevel(beautyLevel)   //录制 设置美颜度  
                .setBeautyStatus(beautyStatus) //录制 设置美颜开关  
                .setCameraType(cameraType) //录制 设置前后置摄像头  
                .setFlashType(flashType) //录制 设置闪光灯模式  
                .setNeedClip(needClip) //录制 设置是否需要支持片段录制  
                .setMaxDuration(max) //录制 设置最大录制时长 单位毫秒  
                .setMinDuration(min) //录制 设置最小录制时长 单位毫秒  
                .setVideoQuality(videoQulity) //录制设置视频质量  
                .setGop(gop) //设置关键帧间隔  
                //   .setVideoBitrate(2000) //录制设置视频码率,如果不设置则使用视频质量videoQulity参数计算出码率  
                .setMinVideoDuration(minVideoDuration) //裁剪 设置过滤的视频最小长度 单位毫秒  
                .setMaxVideoDuration(maxVideoDuration) //裁剪 设置过滤的视频最大长度 单位毫秒  
                .setMinCropDuration(minCropDuration) //裁剪 设置视频最小裁剪时间 单位毫秒  
                .setFrameRate(frameRate) //裁剪 设置帧率  
                .setNeedRecord(needRecord)//设置是否需要开放录制入口  
                .setResulutionMode(resulutionMode) //设置分辨率,目前支持360p,480p,540p,720p  
                .setCropMode(cropMode) //设置裁剪方式,是否使用gpu进行裁剪,不设置则默认使用cpu来裁剪  
                .setSortMode(AliyunSnapVideoParam.SORT_MODE_VIDEO) //设置导入相册过滤选择视频  
                .build();  
          AliyunVideoRecorder.startRecordForResult(this, REQUEST_CODE_RECORD_VIDEO, recordParam);  
    }  

    //分辨率  
    public int onRESOLUTION(String name)  
    {  
        name=name.trim().toLowerCase();  
        Integer num=0;  
        if(name.equals("360p"))  
        {    num= AliyunSnapVideoParam.RESOLUTION_360P;  
        }else if(name.equals("480p")){  
            num= AliyunSnapVideoParam.RESOLUTION_480P;  
        }else if(name.equals("540p")){  
            num= AliyunSnapVideoParam.RESOLUTION_540P;  
        }else if(name.equals("720p"))  
        {  
            num= AliyunSnapVideoParam.RESOLUTION_720P;  
        }  
        return num;  
    }  

    protected void onActivityResult(int requestCode, int resultCode, Intent data)  
    {  
        Intent intent=new Intent();  
        if(requestCode ==REQUEST_CODE_RECORD_VIDEO)  
        {  
            if(resultCode == Activity.RESULT_OK && data!= null)  
            {  
                int type = data.getIntExtra(AliyunVideoRecorder.RESULT_TYPE,0);  
                if(type ==  AliyunVideoRecorder.RESULT_TYPE_CROP) //截取视频  
                {  
                    String path = data.getStringExtra(CropKey.RESULT_KEY_CROP_PATH);  
                    intent.putExtra("resultCode","000000");  
                    intent.putExtra("type","CROP");  
                    intent.putExtra("path",path);  
                  //  intent.putExtra("time",data.getLongExtra(CropKey.RESULT_KEY_DURATION,0));  
                }else if(type ==  AliyunVideoRecorder.RESULT_TYPE_RECORD) //录制视频  
                {  
                    String path = data.getStringExtra(AliyunVideoRecorder.OUTPUT_PATH);  
                    intent.putExtra("resultCode","000000");  
                    intent.putExtra("type","RECORD");  
                    intent.putExtra("path",path);  
                  //  intent.putExtra("time",data.getLongExtra(AliyunVideoRecorder.R,0));  
                }  
            }else if(resultCode == Activity.RESULT_CANCELED)  
            {  
                intent.putExtra("resultCode","-1");  
            }  
        }  
        else {intent.putExtra("resultCode","-2");}  
        setResult(RESULT_OK,intent);  
        this.finish();  
    }  

}

然后在html 页面 用JS通过 Native.js,调用原生类 ,写了一个,AliyunVideo.js 插件:

//实例化插件  
        var   vide=new AliyunVideo(  
                {  
         setResolutionMode:"720p", //录制 设置录制分辨率,目前支持360p,480p,540p,720p  
         setRatioMode:"1/1", //录制 设置视频比例,目前支持1/1 ,3/4, 9/16  
         setRecordMode:"AUTO", //录制 设置录制模式,目前支持按录:PRESS,点录:TOUCH和混合模式:AUTO  
         setBeautyLevel:60, //录制 设置美颜度,1-100,比率  
         setBeautyStatus:true, //录制 设置美颜开关  
         setCameraType:"BACK",  //录制 设置前后置摄像头, 后:BACK ,前:FRONT  
         setFlashType:"OFF",  //录制 设置闪光灯模式,开:NO, 关:OFF, 自动:AUTO  
         setNeedClip:true, //录制 设置是否需要支持片段录制  
         setMaxDuration:15, //录制 设置最大录制时长 单位秒  
         setMinDuration:2, //录制 设置最小录制时长 单位秒  
         setVideoQuality:"HD", //录制设置视频质量 4个级别, 低:LD ,中:SD ,高:HD ,极高:SSD  
         setGop:125, //设置关键帧间隔,建议:1-300之间  
         setMinVideoDuration:5, //裁剪 设置过滤的视频最小长度 单位秒  
         setMaxVideoDuration:15, //裁剪 设置过滤的视频最大长度 单位秒  
         setMinCropDuration:2,  //裁剪 设置视频最小裁剪时间 单位毫秒  
         setFrameRate:25, //裁剪 设置帧率  
         setNeedRecord:false, //设置是否需要开放录制入口,即选择视频的页面,多出一个录制按钮  
         setResulutionMode:"540p", //设置裁剪分辨率,目前支持360p,480p,540p,720p  
         setCropMode:"cpu" //设置裁剪方式,是否使用gpu进行裁剪,不设置则默认使用cpu来裁剪  
                });

// js 打开录制视频页面

              vide.open(function(e)  
                 {  
                       if(e.code=="000000")  
                       {  
                                            //录制视频或裁剪视频,成功后,返回视频一个地址  
                            mui.toast("视频地址:"+e.path);  
                       }  
                       else if(e.code=="-1")  
                       { //用户取消行为  
                          mui.toast("用户已取消");  
                       }  
                 });

下面是AS工程包,因官方上传限制, 不包含阿里云的SDK, 另外下载

5 关注 分享
k***@126.com mmt 梁星 ___K jonyLi

要回复文章请先登录注册

3***@qq.com

3***@qq.com

官方的原生打包文档中的build.gradle文件中的依赖需要用到以下语句,怎么在你的demo里没有用到,这是怎么回事?

implementation fileTree(dir: 'libs', include: ['.aar', '.jar'], exclude: [])

implementation "com.android.support:support-v4:28.0.0"

implementation "com.android.support:appcompat-v7:28.0.0"

implementation 'com.android.support:recyclerview-v7:28.0.0'

implementation 'com.facebook.fresco:fresco:1.13.0'

implementation "com.facebook.fresco:animated-gif:1.13.0"

implementation 'com.github.bumptech.glide:glide:4.9.0'

implementation 'com.alibaba:fastjson:1.1.46.android'
2020-04-27 19:07
3***@qq.com

3***@qq.com

官方的原生打包文档中的build.gradle文件中的依赖需要保护一下语句,怎么在你的demo里没有用到,这是怎么回事?
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
implementation "com.android.support:support-v4:28.0.0"
implementation "com.android.support:appcompat-v7:28.0.0"
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.facebook.fresco:fresco:1.13.0'
implementation "com.facebook.fresco:animated-gif:1.13.0"
implementation 'com.github.bumptech.glide:glide:4.9.0'
implementation 'com.alibaba:fastjson:1.1.46.android'
2020-04-27 19:05
wenju

wenju

您好 问一下 com.aliyun.demo.recorder.AliyunVideoRecorder 这个如何引入的
2019-08-09 14:07
zhangdaren

zhangdaren

大佬,我用最新版的uni打包出现这个问题,报错信息如上帖,调不到activity了,而用你的demo是没有问题的,之前的uni也没问题,后面升级就出现问题了
2019-06-07 13:46
zhangdaren

zhangdaren

Android-runtime FATAL EXCEPTION: main
No static field design_bottom_sheet_dialog of type I in class Lcom/aliyun/snap/snap_core/R$layout; ……
2019-06-07 13:45
zhangdaren

zhangdaren

Android-runtime FATAL EXCEPTION: main
No static field design_bottom_sheet_dialog of type I in class Lcom/aliyun/snap/snap_core/R$layout; ……
2019-06-07 13:43
8***@qq.com

8***@qq.com

回复 王者地带 :
解决了,谢谢回答,http://ask.dcloud.net.cn/question/72229
2019-06-05 12:53
王者地带

王者地带 (作者)

回复 8***@qq.com :
没做过 uniapp 的,也许确实是有冲突问题
2019-06-05 12:36
8***@qq.com

8***@qq.com

回复 王者地带 :
大神,我学你的整合阿里短视频,遇到一个问题,uniapp video标签跟implementation 'com.alivc.conan:AlivcConan:0.9.3'冲突,导致标签video里的视频不能播放,注释掉这个依赖就可以,但是这个依赖又必须要用,有什么解决办法吗
2019-06-05 10:48
王者地带

王者地带 (作者)

回复 i***@qq.com :
技术要求有点高
2019-05-02 21:14