更新记录

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