当前位置: 首页 > news >正文

【HarmonyOS】【续集】实现从视频提取音频并保存到pcm文件功能(API6 Java)

【关键字】

视频提取类Extractor、视频编解码、保存pcm文件、getAudioTime

【背景和问题】

上篇中介绍了从视频提取音频并保存到pcm文件功能,请参考文档:https://developer.huawei.com/consumer/cn/forum/topic/0209125665541017202?fid=0101591351254000314,解码步骤使用的是普通模式进行解码,测试过程中发现此模式从视频提取音频到保存文件整体流程耗时较长,可能十几秒视频读取需要一两分钟,主要普通模式解码过程比较耗时,本文针对此问题提供解决方案。

【解决方案】

关于视频编解码开发指导文档中,除了普通模式编解码,还有管道模式编解码,经测试,使用管道模式进行解码会快很多,解码具体开发步骤见文档即可,将上篇文章“从视频提取音频并保存到pcm文件功能”中解码开发步骤替换成使用管道模式进行解码即可,使用Extractor从视频提取音频数据和将音频数据写入pcm文件过程与原来一致。

【音频播放类接口getAudioTime说明】

1、关于getAudioTime接口,官方文档解释为“获取播放时间戳信息”,通过此接口返回的TimeStamp对象中包含getNanoTimestamp信息,此数据并非表示音频开始播放,到当前播放的时长,如果一个10s音频,播放到5s时并非返回5s对应的纳秒数;也并非跟系统时间有关,返回的数据无法转换成系统时间戳;

此接口通常使用方式为:若想要获取当前播放的时间信息,可以在播放开始时通过getAudioTime接口记录时间,然后在播放过程中再调用一次记录时间,两次时间相减再转换成秒单位的数据,即可获取正确播放时间;

(由于此接口比较耗费性能,若音频较长需要调用接口次数比较多,建议直接通过java原生方法在播放开始和过程中分别记录时间,然后相减获取播放时长,此方式性能更优)

2、调用getAudioTime接口是需要调用getStage方法检查播放状态,需要在播放过程中调用才可正确返回数据。

【视频转音频过程中,解码如何判断是否完成?】

在framebuffer方法中,若bufferInfo.bufferType为4表示解码完成,可通过此数据判断是否完成解码。

【参考文档】

  • 实现从视频提取音频并保存到pcm文件功能:https://developer.huawei.com/consumer/cn/forum/topic/0209125665541017202?fid=0101591351254000314

  • 视频解码文档(管道模式):

    https://developer.harmonyos.com/cn/docs/documentation/doc-guides/media-video-codec-0000000000031749#section151781927112310

  • 媒体提取开发指导:

    https://developer.harmonyos.com/cn/docs/documentation/doc-guides/media-video-extractor-0000000000044202

  • 音频播放开发指导:

    https://developer.harmonyos.com/cn/docs/documentation/doc-guides/media-audio-playback-0000000000031734

  • getAudioTime API接口文档:

    https://developer.harmonyos.com/cn/docs/documentation/doc-references/audiorenderer-0000001054358892#ZH-CN_TOPIC_0000001054358892__getAudioTime--

http://www.lryc.cn/news/115206.html

相关文章:

  • MySQL为什么要使用 B+Tree 作为索引结构?
  • Three.js阴影
  • VSCode Remote-SSH (Windows)
  • 现代C++中的从头开始深度学习【1/8】:基础知识
  • Jwt(Json web token)——使用token的权限验证方法 用户+角色+权限表设计 SpringBoot项目应用
  • SpringWeb项目核心功能总结
  • Django------信号
  • HTML5 中新增了哪些表单元素?
  • [考研机试] KY20 完数VS盈数 清华大学复试上机题 C++实现
  • re学习(30)攻防世界-hackme(代码复原2)
  • Go Windows下开发环境配置(图文)
  • 【人工智能概述】python妙用 __str__()
  • android kernel移植5-RK3568
  • C++——string类介绍
  • 教雅川学缠论07-中枢实战众泰汽车000980
  • REDIS主从配置
  • 【测试】软件测试工具JMeter简单用法
  • 五个授权关键,为智能驾驶量产赋能
  • 【代码随想录-Leetcode第三题:977. 有序数组的平方】
  • [运维|中间件] Apache APISIX Dashboard部署(持续踩坑更新。。。)
  • Vue中watch监听属性新旧值相同问题解决方案
  • awk案例练习
  • Debian 12.1 正式发布
  • neo4j清空数据库
  • SpringBoot整合Mybatis-Plus
  • 在langchain中使用自定义example selector
  • pytest常用执行参数详解
  • 本地项目如何连接git远程仓库
  • 力扣 494. 目标和
  • Maven-搭建私有仓库