更新记录
1.0(2020-12-09) 下载此版本
1、发布版本1.0
平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:5.1 - 10.0 | armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 | × |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
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>
创作不易,喜欢的朋友请帮忙给个好评!万分感谢!