更新记录

1.0(2020-12-09)

1、发布版本1.0


平台兼容性

Android Android CPU类型 iOS
适用版本区间:5.1 - 10.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 ×

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


Android视频压缩插件

此库使用Android原生的MediaCodec实现视频压缩、剪辑的功能,在支持MediaCodec的手机上优于使用FFmpeg的方案。

·体积小 :目前1.0版本aar包仅14kb ·速度快 :在huaweiP9上压缩(1080P 20s 20000k -> 720p 2000k)

插件目前支持三个方法调用,分别是:

中文 方法名
视频压缩 compress
获取视频信息 getVideoInfo
删除文件 deleteFile

视频压缩

testModule.compress(Object,Function,Function)

Object参数

参数名 说明 类型 是否必填 备注
inPath 输入路径 String 绝对路径
outPath 输出路径 String 绝对路径,不指定则默认为输入路径文件夹下,文件名为时间戳.mp4
outHeight 输出视频高度 Number 压缩视频主要参数
outWidth 输出视频宽度 Number 压缩视频主要参数
bitrate 输出码率 Number 压缩视频主要参数
frameRate 输出帧率 Number 压缩视频主要参数
startTimeMs 剪辑开始时间 Number 视频剪辑主要参数,单位毫秒 ms
endTimeMs 剪辑结束时间 Number 视频剪辑主要参数,单位毫秒 ms
speed 速率 Float 视频剪辑主要参数,例2.0 视频2倍速
changeAudioSpeed 音频是否和视频同步变化 Boolean 默认为true,改变速率时使用

成功回调-对象参数

参数名 说明 类型 备注
progress 进度 Float 范围0.0~1.0,等于1.0时可认为压缩完成
done 是否压缩完成 Boolean -
outPath 输出路径 String 压缩后视频绝对路径

获取视频信息

testModule.getVideoInfo(Object,Function,Function)

Object参数

参数名 说明 类型 是否必填 备注
path 本地视频路径 String 绝对路径,path和url必填其一
url 网络视频url String path和url必填其一
timeUs 捕获帧时间 Number 默认捕获首帧图片,单位微妙(1秒=1000毫秒=1000000微妙)

成功回调-对象参数

参数名 说明 类型 备注
frameBase64 捕获帧图像Base64 String 需拼接base64图片头显示
duration 视频长度 Number 单位毫秒 ms
width 视频宽度 Number -
height 视频高度 Number -

删除文件

testModule.deleteFile(Object,Function)

Object参数

参数名 说明 类型 是否必填 备注
path 本地文件路径 String 绝对路径

回调-对象参数

参数名 说明 类型 备注
success 删除是否成功 Boolean -

临时路径转绝对路径 绝对路径=plus.io.convertLocalFileSystemURL(临时路径)

代码示例:

<template>
    <view>
        <button @click="chooseVideo(1)">{{text}}</button>
        <button @click="chooseVideo(2)">获取视频信息</button>
        <button :disabled="!outPath" @click="deleteFile">{{delText}}</button>
        </br>
        <view class="content">
            <label style="word-break: break-all;">压缩后视频路径:{{outPath}}</label>
            <label>视频首帧/指定帧图片:</label>
            <image v-if="frameBase64" :src="frameBase64" mode="aspectFit"></image>
            <label>视频长度:{{duration}}</label>
            <label>视频宽:{{width}}</label>
            <label>视频高:{{height}}</label>
        </view>
    </view>
</template>

<script>
    var testModule = uni.requireNativePlugin('G-VideoCompress-VideoCompressModule')
    export default {
        data() {
            return {
                text: '压缩视频',
                delText: '删除输出视频',
                src: '',
                frameBase64: '',
                duration: undefined,
                width: undefined,
                height: undefined,
                outPath: ''
            }
        },
        methods: {
            //拍摄视频
            chooseVideo: function(type) {
                var self = this;
                uni.chooseVideo({
                    count: 1,
                    sourceType: ['camera'],
                    maxDuration: 15,
                    success: function(res) {
                        if (type == 1) {
                            self.compress(res.tempFilePath)
                        } else {
                            self.getInfo(true, res.tempFilePath)
                        }
                    },
                })
            },
            //压缩视频
            compress: function(path) {
                this.text = "开始压缩"
                testModule.compress({
                    //输入输出
                    inPath: plus.io.convertLocalFileSystemURL(path), //绝对路径
                    // outPath: '', //输出绝对路径,非必填,默认为输入路径文件夹下,文件名为时间戳.mp4

                    //压缩参数
                    outHeight: 768, //输出视频高度
                    outWidth: 1366, //输出视频宽度
                    // bitrate: 150000, //码率
                    // frameRate: 20, //帧率

                    //剪辑参数 注意:执行顺序是先裁剪后改变速率
                    // startTimeMs: 0, //剪辑开始时间毫秒
                    // endTimeMs: 10000, //剪辑结束时间毫秒
                    // speed: 2.0, //视频速率
                    //changeAudioSpeed: true, //改变视频速率时,音频是否同步变化 默认为true
                }, (res) => {//压缩过程回调
                    //done标识完成 也可通过progress==1.0来判断
                    if (res.done) {
                        this.text = "压缩完成"
                        this.outPath = res.outPath //输出路径
                        setTimeout(() => {
                            this.getInfo(false, this.outPath)
                        }, 1000)
                        return
                    }
                    this.text = '压缩进度:' + this.toPercent(res.progress)
                }, (e) => {//压缩失败回调
                    this.text = '压缩失败'
                })
            },
            //获取视频信息
            getInfo: function(isTemp, path) {
                testModule.getVideoInfo({
                    // url: 'http://edge.ivideo.sina.com.cn/36503887301.mp4?KID=sina,viask&Expires=1607616000&ssig=4x6KvKqzYL&reqid=', //网络视频地址
                    path: isTemp ? plus.io.convertLocalFileSystemURL(path) : path, //本地视频绝对路径
                    // timeUs: 1000000, //1s 不指定返回首帧图片,单位是(微妙)
                }, (res) => {//成功回调
                    this.frameBase64 = 'data:image/jpeg;base64,' + res.frameBase64; //指定时间帧图片
                    this.duration = res.duration + 'ms'; //时长 毫秒
                    this.width = res.width; //宽
                    this.height = res.height; //高
                }, (e) => {})//失败回调
            },
            //删除文件
            deleteFile: function() {
                testModule.deleteFile({
                    path: this.outPath
                }, (res) => {
                    if (res.success) {
                        this.delText = '删除成功'
                    } else {
                        this.delText = '删除失败'
                    }
                });
            },
            //转百分比
            toPercent(point) {
                if (point == 0) {
                    return "0%";
                }
                var str = Number(point * 100).toFixed();
                str += "%";
                return str;
            }
        }
    }
</script>

创作不易,喜欢的朋友请帮忙给个好评!万分感谢!

隐私、权限声明

1. 本插件需要申请的系统权限列表:

文件读写权限、相机权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

作者未提供license.md

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问