OpenHarmony多媒体-mp4parser

news/2024/12/23 7:53:14/

简介

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

编译运行

1、通过IDE工具下载依赖SDK,Tools->SDK Manager->Openharmony SDK 把native选项勾上下载,API版本>=10

2、开发板选择RK3568,ROM下载地址. 选择开发板类型是rk3568,请使用最新的版本

3、下载源码

git clone https://gitee.com/openharmony-tpc/mp4parser.git --recurse-submodules

4、项目依赖FFmpeg库,关于FFmpeg的编译:FFmpeg源码基于版本号:n4.2.5. 请参考:OpenHarmony编译构建指导. 编译脚本参考详见目录:doc/

下载安装

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: '执行成功' })}else {AlertDialog.show({ message: '执行失败' })}}}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: '执行成功' })}else {AlertDialog.show({ message: '执行失败' })}}}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: '执行成功' })}else {AlertDialog.show({ message: '执行失败' })}}}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: '执行成功' })}else {AlertDialog.show({ message: '执行失败' })}}}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: '执行成功' })}else {AlertDialog.show({ message: '执行失败' })}}}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: '执行成功' })}else {AlertDialog.show({ message: '执行失败' })}}}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)

目录结构

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

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向


http://www.ppmy.cn/news/1424057.html

相关文章

数字乡村创新实践探索农业现代化与乡村振兴新路径:科技赋能农村全面振兴与农民福祉新纪元

目录 引言 一、数字乡村与农业现代化新路径 1、智慧农业引领农业现代化 2、农业产业链的数字化转型 二、数字乡村与乡村振兴新路径 1、农村信息化水平的提升 2、农村治理模式的创新 三、科技赋能农村全面振兴与农民福祉新纪元 1、提升农业生产效益与农民收入 2、促进…

docker 容器中安装cron,却无法启动定时任务

问题描述: 当我是在Dockerfile配置安装cron RUN apt-get update && apt-get install -y cron 或者进入容器中安装cron apt-get install -y cron 都会有个问题就是cron服务正常启动,但是加入到/etc/con.d下的任务,或者crontab -…

对比实验系列:Efficientdet环境配置及训练个人数据集

一、源码下载 可以通过下方链接下载Efficientdet源码 GitHub - zylo117/Yet-Another-EfficientDet-Pytorch: The pytorch re-implement of the official efficientdet with SOTA performance in real time and pretrained weights.The pytorch re-implement of the official …

thinkphp 框架封装curl请求

tp6 或者 tp8框架 在框架的app/common.php 文件里加一些方法就可以 app\common.php 在这个文件里加 以下代码 就可以实现基于 curl的请求方法 (记得要开启 php的curl扩展) 查看方法 cmd里输入 php -m if (!function_exists(get)) {/*** 发送get请求* param string $url 请求…

开发语言漫谈-kotlin

程序的运行环境包括移动设备、服务端、浏览器,服务器又分为window、linux等,不同的环境使用不同的开发语言。为了解决这个问题,开发IDE大拿JetBrains开发了kotlin。 Kotlin是一个岛屿的名字,全称是Kotlin Island。这个小岛位于俄罗…

人工智能与IP代理池:解析网络数据采集的未来

前言 随着互联网的快速发展,数据成为了当今社会最宝贵的资源之一。然而,要获取大量的网络数据并进行有效的分析,往往需要面对诸多挑战,其中之一就是网络封锁与反爬虫机制。在这个背景下,人工智能(AI&#x…

vue源码解析patch.js

前言:在vue2.0 中,VNode转换成真正的DOM是通过patch(oldVNode,VNode,hydrating)方法实现的。 源码目录:/vue/src/core/vdom/patch.ts // oldVnode 一个真实的DOM或者一个Vnode对象// vnode 一个待替换的Vnode对象// hydrating 是否支持服务端…

充值掉单的理解

个人笔记(整理不易,有帮助,收藏点赞评论,爱你们!!!你的支持是我写作的动力) 笔记目录:学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔…