
回复
使用鸿蒙开源第三方库videocompressor 方法来实现对视频码流的压缩,具体解决思路如下:
1、第一步:在你的项目中 使用ohpm install @ohos/videocompressor 命令,下载三方库
2、第二步:在页面中引入三方库videocompressor
3、第三步:实例化 new VideoCompressor(),并传入 getContext(),this.selectFilePath,CompressQuality.COMPRESS_QUALITY_HIGH 等参数(说明 context:上下文,inputFilePath: 需要压缩的视频路径, quality: 压缩视频质量)
4、第四步:压缩完成后取到压缩后的地址 data.outputPath
5、第五步:再使用fileIo和相关工具类读取文件并转为base64字符串
这里给出示例代码,供大家参考学习
// 在页面中导入鸿蒙三方库videocompressor
import { CompressorResponseCode, CompressQuality, VideoCompressor} from "@ohos/videocompressor"
// 封装压缩视频方法
zipVideo(){
let videoCompressor = new VideoCompressor();
videoCompressor.compressVideo(getContext(),this.videoUri,CompressQuality.COMPRESS_QUALITY_HIGH).then((data) => {
if (data.code == CompressorResponseCode.SUCCESS) {
console.log("videoCompressor HIGH message:" + data.message + "--outputPath:" + data.outputPath);
const amrFile = fileIo.openSync(data.outputPath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
const stat = fileIo.statSync(amrFile.fd)
const buffer = new ArrayBuffer(stat.size)
fileIo.readSync(amrFile.fd, buffer)
const helper = new util.Base64Helper()
let base64 = helper.encodeToStringSync(new Uint8Array(buffer))
console.log('压缩之后的数据长度是'+ base64.length/1024)
// this.bufferSize = 0
// 删除缓存的文件 同时关闭文件 根据需求来
fileIo.rmdirSync(data.outputPath)
fileIo.closeSync(amrFile)
// 将base64字符串传给后端
let params: Record<string, Object> = { 'result': base64};
apiPost(params)
} else {
console.log("videoCompressor HIGH code:" + data.code + "--error message:" + data.message);
}
}).catch((err:BusinessError) => {
console.log("videoCompressor HIGH get error message" + err.message);
})
}
调用方法
// 视频录制完成后的提交方法中来执行压缩方法
this.zipVideo()
支持的视频规格:
1、支持的解封装格式:
媒体格式 封装格式
视频 mp4、mpeg.ts
2、支持的视频解码格式:
视频解码类型
AVC(H.264)、 HEVC(H.265)
3、支持的音频解码格式:
音频解码类型
AAC
4、支持的音频编码格式:
音频编码类型
AAC
5、支持的封装格式:
媒体格式 封装格式
视频 mp4