OpenHarmony多媒体-mp4parser

简介

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

编译运行

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/

下载安装

shell 复制代码
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 = 0
        that.imageHeight = 0
        if (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=0
        that.imageHeight=0
        if (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 = 0
        that.imageHeight = 0
        if (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 = 0
        that.imageHeight = 0
        if (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 = 0
        that.imageHeight = 0
        if (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 = 0
        that.imageHeight = 0
        if (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.鸿蒙南向开发方向

相关推荐
yy我不解释1 小时前
关于comfyui的mmaudio音频生成插件时时间不一致问题(一)
python·ai作画·音视频·comfyui
Sendingab4 小时前
2026 年 AI 数字人口播新趋势:智能体 Agent 将如何重构短视频内容生产与营销
人工智能·重构·音视频
郭泽斌之心6 小时前
Fay数字人视频播放器
音视频
心中有国也有家7 小时前
ArkTS 鸿蒙开发语法完全指南:从入门到实战
华为·harmonyos
愚公搬代码9 小时前
【愚公系列】《剪映+DeepSeek+即梦:短视频制作》015-特效:轻松提升视频质感(特效的应用)
音视频
Georgewu9 小时前
如何判断应用在鸿蒙卓易通或者出境易环境下?
android·harmonyos
菜鸟不学编程10 小时前
鸿蒙中的 AR/VR 开发与场景创建
ar·vr·harmonyos
Swift社区11 小时前
鸿蒙应用上架流程经验
华为·harmonyos
@不误正业12 小时前
OpenHarmony集成AI Agent实战:打造鸿蒙智能助理
人工智能·华为·harmonyos
EasyDSS15 小时前
RTMP高清推流直播/视频转码EasyDSS在无人机RTMP直播场景中的应用技术解析
ffmpeg·音视频·无人机·视频转码·语音转写·点播技术