【鸿蒙HarmonyOS Next实战开发】mp4parser库-音视频裁剪、合成、取帧等操作

mp4parser

简介

一个读取、写入操作音视频文件编辑的工具。

下载安装

ohpm install @ohos/mp4parser

OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包

使用说明

视频合成

  import {MP4Parser} from "@ohos/mp4parser";import {ICallBack} from "@ohos/mp4parser";/*** 视频合成*/private videoMerge() {let getLocalDirPath = getContext(this).cacheDir+"/";let that = this;let filePathOne = getLocalDirPath + "qqq.mp4";let filePathTwo = getLocalDirPath + "www.mp4";let outMP4 = getLocalDirPath + "mergeout.mp4";var callBack: ICallBack = {callBackResult(code: number) {that.btnText = "视频合成点击执行"that.imageWidth = 0that.imageHeight = 0if (code == 0) {AlertDialog.show({ message: $r('app.string.ok') })}else {AlertDialog.show({ message: $r('app.string.failed') })}}}MP4Parser.videoMerge(filePathOne, filePathTwo, outMP4, callBack);}

视频裁剪

import {MP4Parser} from "@ohos/mp4parser";
import {ICallBack} from "@ohos/mp4parser";/*** 视频裁剪*/private videoClip() {let getLocalDirPath = getContext(this).cacheDir+"/";let that=this;let sTime = "00:00:10";let eTime = "00:00:20";let sourceMP4 = getLocalDirPath+"qqq.mp4";let outMP4 = getLocalDirPath+"clipout.mp4";var callBack: ICallBack = {callBackResult(code: number) {that.btnText="视频裁剪点击执行"that.imageWidth=0that.imageHeight=0if (code == 0) {AlertDialog.show({ message: $r('app.string.ok') })}else {AlertDialog.show({ message: $r('app.string.failed') })}}}MP4Parser.videoClip(sTime, eTime, sourceMP4, outMP4, callBack);}

音频合成

import {MP4Parser} from "@ohos/mp4parser";
import {ICallBack} from "@ohos/mp4parser";/*** 音频合成*/private audioMerge() {let getLocalDirPath = getContext(this).cacheDir+"/";let that = this;let filePathOne = getLocalDirPath + "a.mp3";let filePathTwo = getLocalDirPath + "b.mp3";let outPath = getLocalDirPath + "mergeout.mp3";var callBack: ICallBack = {callBackResult(code: number) {console.log("mp4parser-->audioMerge--->end");that.btnText = "音频合成点击执行"that.imageWidth = 0that.imageHeight = 0if (code == 0) {AlertDialog.show({ message: $r('app.string.ok') })}else {AlertDialog.show({ message: $r('app.string.failed') })}}}MP4Parser.audioMerge(filePathOne, filePathTwo, outPath, callBack);}

音频裁剪

import {MP4Parser} from "@ohos/mp4parser";
import {ICallBack} from "@ohos/mp4parser";/*** 音频裁剪*/private audioClip() {let getLocalDirPath = getContext(this).cacheDir+"/";let that = this;let sTime = "00:00:00";let eTime = "00:00:10";let sourcePath = getLocalDirPath + "a.mp3";let outPath = getLocalDirPath + "clipout.mp3";var callBack: ICallBack = {callBackResult(code: number) {that.btnText = "音频裁剪点击执行"that.imageWidth = 0that.imageHeight = 0if (code == 0) {AlertDialog.show({ message: $r('app.string.ok') })}else {AlertDialog.show({ message: $r('app.string.failed') })}}}MP4Parser.audioClip(sTime, eTime, sourcePath, outPath, callBack);}

视频批量合成

import {MP4Parser} from "@ohos/mp4parser";
import {ICallBack} from "@ohos/mp4parser";/*** 视频批量合成*/private videoMultMerge() {let that = this;let getLocalDirPath = getContext(this).cacheDir+"/";let filePath = getLocalDirPath + "mergeList.txt";let outMP4 = getLocalDirPath + "mergeout3.mp4";var callBack: ICallBack = {callBackResult(code: number) {that.btnText2 = "视频合成点击执行"that.imageWidth = 0that.imageHeight = 0if (code == 0) {AlertDialog.show({ message: $r('app.string.ok') })}else {AlertDialog.show({ message: $r('app.string.failed') })}}}MP4Parser.videoMultMerge(filePath, outMP4, callBack);}

音频批量合成

import {MP4Parser} from "@ohos/mp4parser";
import {ICallBack} from "@ohos/mp4parser";/*** 音频批量合成*/private audioMultMerge() {let getLocalDirPath = getContext(this).cacheDir+"/";let that = this;let filePath = getLocalDirPath + "mergewavList.txt";let outPath = getLocalDirPath + "mergeout3.wav";var callBack: ICallBack = {callBackResult(code: number) {that.btnText2 = "音频合成点击执行"that.imageWidth = 0that.imageHeight = 0if (code == 0) {AlertDialog.show({ message: $r('app.string.ok') })}else {AlertDialog.show({ message: $r('app.string.failed') })}}}MP4Parser.audioMultMerge(filePath, outPath, callBack);}

视频取帧

import {ICallBack, IFrameCallBack, MP4Parser} from "@ohos/mp4parser";private getFrameAtTimeRang() {let getLocalDirPath = getContext(this).cacheDir + "/";let sourceMP4 = getLocalDirPath + "www.mp4";let that = this;var callBack: ICallBack = {callBackResult(code: number) {if (code == 0) {var frameCallBack: IFrameCallBack = {async callBackResult(data: ArrayBuffer, timeUs: number) {const imageSource = image.createImageSource(data)that.imagePixelMap = await imageSource.createPixelMap()}}MP4Parser.getFrameAtTimeRang("1000000", "9000000", MP4Parser.OPTION_CLOSEST, frameCallBack);}}}MP4Parser.setDataSource(sourceMP4, callBack);}

调用FFmpeg指令

 let context = AbilityDelegatorRegistry.getAbilityDelegator().getAppContext()let getLocalDirPath = context.cacheDir + "/";let sTime = "00:00:01";let eTime = "00:00:02";let sourceMP4 = getLocalDirPath + "testvideo.mp4";let outMP4 = getLocalDirPath + "out.mp4";let callBack: ICallBack = {callBackResult(code: number) {expect(0).assertEqual(code)done()}}MP4Parser.ffmpegCmd("ffmpeg -y -i " + sourceMP4 + " -ss " + sTime + " -c copy -to " + eTime + " " + outMP4, callBack)

接口说明

import {MP4Parser} from "@ohos/mp4parser";

  1. 视频合成 MP4Parser.videoMerge()
  2. 视频裁剪 MP4Parser.videoClip()
  3. 批量视频合成 MP4Parser.videoMultMerge()
  4. 音频合成 MP4Parser.audioMerge()
  5. 音频裁剪 MP4Parser.audioClip()
  6. 音频批量合成 MP4Parser.audioMultMerge()
  7. 设置视频源 MP4Parser.setDataSource()
  8. 视频取帧 MP4Parser.getFrameAtTimeRang()
  9. 停止取帧 MP4Parser.stopGetFrame()
  10. 调用FFmpeg指令 MP4Parser.ffmpegCmd()

约束与限制

在下述版本验证通过:

DevEco Studio版本: 4.0 Release(4.0.3.413), SDK: (4.0.10.3) DevEco Studio 版本: 4.1 Canary(4.1.3.317),OpenHarmony SDK: API11 (4.1.0.36) DevEco Studio: NEXT Beta1-5.0.3.806, SDK: API12 Release (5.0.0.66)

目录结构

|---- mp4parser  
|     |---- entry  # 示例代码文件夹
|     |---- library  # mp4parser库文件夹
|           |---- MP4Parser.ets  # 对外接口
|     |---- README.MD  # 安装使用方法                    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis项目

短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节,我们会理解缓存击穿,缓存穿透,缓存雪崩等问题,让小伙伴的对于这些概念的理解不仅仅是停留在概念上,更是能在代码中看到对应的内容 优惠…

Ubuntu 多版本 gcc 配置常用命令备忘

用的频率不高,总忘记具体参数 1,安装多版本 gcc 以 gcc-11 和12 为例: sudo apt-get install gcc-11 gcc-12 sudo apt-get install gcc-11 gcc-12 2,配置多版本 gcc gcc 与 g 一起配置进数据库中: sudo update-a…

【kubernetes组件合集】深入解析Kubernetes组件之三:client-go

深入解析Kubernetes组件之三:client-go 目录 深入解析Kubernetes组件之三:client-go 引言 1. client-go简介 2. client-go的功能 2.1 资源操作 2.2 资源监听 2.3 认证和授权 2.4 错误处理和重试 2.5 扩展性和定制化 3. 使用client-go与Kubern…

多项式插值(数值计算方法)Matlab实现

多项式插值(数值计算方法)Matlab实现 一. 原理介绍二. 程序设计1. 构建矩阵2. 求解矩阵方程3. 作出多项式函数4. 绘制插值曲线5. 完整代码 三. 图例 一. 原理介绍 关于插值的定义及基本原理可以参照如下索引 插值原理(数值计算方法&#xff…

vite + axios 代理不起作用 404 无效

vite axios 代理不起作用 先看官方示例 export default defineConfig({server: {proxy: {// 字符串简写写法/foo: http://localhost:4567,// 选项写法/api: {target: http://jsonplaceholder.typicode.com,changeOrigin: true,rewrite: (path) > path.replace(/^\/api/, )…

国产编辑器EverEdit - 编辑辅助功能介绍

1 编辑辅助功能 1.1 各编辑辅助选项说明 1.1.1 行号 打开该选项时,在编辑器主窗口左侧显示行号,如下图所示: 1.1.2 文档地图 打开该选项时,在编辑器主窗口右侧靠近垂直滚动条的地方显示代码的缩略图,如下图所示&…

深入理解Java对接DeepSeek

其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。 1.获取 KEY https://platform.deepseek.com/transactions 直接付款就是了(现在官网暂停充值2025年2月7日&#xf…

调用DeepSeek官方的API接口

效果 前端样式体验链接:https://livequeen.top/deepseekshow 准备工作 1、注册deepseek官网账号 地址:DeepSeek 点击进入右上角【API开放平台】,并进行账号注册。 2、注册完成后,依次点击【API keys】-【生成API key】&#x…

香港中文大学 Adobe 推出 MotionCanvas:开启用户掌控的电影级图像视频创意之旅。

简介: 亮点直击 将电影镜头设计引入图像到视频的合成过程中。 推出了MotionCanvas,这是一种简化的视频合成系统,用于电影镜头设计,提供整体运动控制,以场景感知的方式联合操控相机和对象的运动。 设计了专门的运动条…

01.Docker 概述

Docker 概述 1. Docker 的主要目标2. 使用Docker 容器化封装应用程序的意义3. 容器和虚拟机技术比较4. 容器和虚拟机表现比较5. Docker 的组成6. Namespace7. Control groups8. 容器管理工具9. docker 的优缺点10. 容器的相关技术 docker 官网: http://www.docker.com 帮助文档…

【DeepSeek】deepseek可视化部署

目录 1 -> 前文 2 -> 部署可视化界面 1 -> 前文 【DeepSeek】DeepSeek概述 | 本地部署deepseek 通过前文可以将deepseek部署到本地使用,可是每次都需要winR输入cmd调出命令行进入到命令模式,输入命令ollama run deepseek-r1:latest。体验很…

开启对话式智能分析新纪元——Wyn商业智能 BI 携手Deepseek 驱动数据分析变革

2月18号,Wyn 商业智能 V8.0Update1 版本将重磅推出对话式智能分析,集成Deepseek R1大模型,通过AI技术的深度融合,致力于打造"会思考的BI系统",让数据价值触手可及,助力企业实现从数据洞察到决策执…

Response 和 Request 介绍

怀旧网个人博客网站地址:怀旧网,博客详情:Response 和 Request 介绍 1、HttpServletResponse 1、简单分类 2、文件下载 通过Response下载文件数据 放一个文件到resources目录 编写下载文件Servlet文件 public class FileDownServlet exten…

分层耦合 - IOC详解

推荐使用下面三种, 第一种多用于其他类 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用…

STM32 Flash详解教程文章

目录 Flash基本概念理解 Flash编程接口FPEC Flash擦除/写入流程图 Flash选项字节基本概念理解 Flash电子签名 函数读取地址下存放的数据 Flash的数据处理限制部分 编写不易,请勿搬运,感谢理解!!! Flash基本概念…

WPF 设置宽度为 父容器 宽度的一半

方法1:使用 绑定和转换器 实现 创建类文件 HalfWidthConverter public class HalfWidthConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double width){return width / 4…

【Ubuntu VScode Remote SSH 问题解决】Resolver error: Error: XHR failed

1. 问题描述 VScode使用remote ssh 远程服务器,报错类似: [12:06:01.219] Downloading VS Code server locally... [12:06:01.310] Resolver error: Error: XHR failedat k.onerror (vscode-file://vscode-app/private/var/folders/g1/cvs2rnpx60qc3b4…

32单片机学习记录1之GPIO

32单片机学习记录1之GPIO 前置 GPIO口在单片机中扮演着什么角色? 在单片机中,GPIO口(General Purpose Input/Output) 是一种通用输入/输出接口,扮演着连接单片机与外部设备的桥梁角色。具体来说,它在单片…

第三十二周:Informer学习笔记

目录 摘要Abstract1 Informer1.1 预备知识1.2 模型框架1.3 实验分析 总结 摘要 本周学习的主要内容是Informer模型,Informer是一种专为长序列时间序列预测(LSTF) 设计的Transformer模型。相较于传统的Transformer,Informer采用Pr…

绩效归因概述

绩效归因概述 1. 分类2. 基于净值的归因方法2.1 发展背景2.2 择时选股模型 T-M模型2.3 择时选股模型 H-M模型2.4 择时选股模型 C-L模型2.5 风格配置模型-Sharpe2.6 多因子模型 Fama-French32.7 多因子模型 Carhart42.8 多因子模型 Fama-French5 3. 基于持仓的归因方法3.1 发展背…