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

【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)

 【关键字】

音频编码、管道模式、createEncoder

【写在前面】

在使用API6开发HarmonyOS应用时,如何将pcm源文件进行编码并写入文件,最后生成aac文件,本文直接附上主要代码开发步骤供大家参考。

【主要功能代码】

import ohos.media.codec.Codec;
import ohos.media.common.BufferInfo;
import ohos.media.common.Format;
import ohos.media.common.Source;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;public class AudioEncoder {void creatEncoder(){}FileOutputStream fileOutputStream = null;public void encode(){System.out.println("encode start");try {File fd = new File("/data/data/com.example.myapplication/11.aac");fileOutputStream = new FileOutputStream(fd, true);} catch (FileNotFoundException e) {System.out.println("FileNotFoundException");} finally {}final Codec encoder = Codec.createEncoder();String path = "/data/data/com.example.myapplication/11.pcm";System.out.println("encoder = " + encoder);boolean ret = encoder.setSource(new Source(path), null);System.out.println("setSource ret = " + ret);Format fmt = new Format();// format格式中转码率和声道需与pcm相同fmt.putStringValue(Format.MIME, Format.AUDIO_AAC);fmt.putIntValue(Format.BIT_RATE, 128000);fmt.putIntValue(Format.CHANNEL, 2);fmt.putIntValue(Format.SAMPLE_RATE, 44100);fmt.putIntValue(Format.FRAME_RATE, 30); // 此设置必须,数值一般为30/60,或自行设置需要数值boolean b1 = encoder.setSourceFormat(fmt);System.out.println("setSourceFormat = " + b1);Codec.ICodecListener listener = new Codec.ICodecListener() {@Overridepublic void onReadBuffer(ByteBuffer byteBuffer, BufferInfo bufferInfo, int trackId) {System.out.println("byteBuffer = " + byteBuffer + "trackId = " + trackId + "bufferinfo = " + bufferInfo.bufferType);if(bufferInfo.bufferType == 4){encoder.stop();encoder.release();try {fileOutputStream.close();} catch (IOException e) {// 打印异常System.out.println("IOException");}return;}writeFile(byteBuffer,bufferInfo,trackId);}@Overridepublic void onError(int errorCode, int act, int trackId) {System.out.println( "PlayerCallback onError errorCode: "+errorCode +", trackId:"+trackId);}};boolean b = encoder.registerCodecListener(listener);System.out.println("registerCodecListener = " + b);boolean start = encoder.start();System.out.println("start = " + start);}private void writeFile(ByteBuffer outputBuffer, BufferInfo info, int trackId) {try {final byte[] chunk = new byte[info.size+7];addADTSHeader(chunk,info.size+7);outputBuffer.get(chunk,7,info.size);fileOutputStream.write(chunk);outputBuffer.clear();} catch (FileNotFoundException e) {System.out.println("FileNotFoundException");} catch (IOException e) {System.out.println("IOException");} finally {}}/*** 添加AAC帧文件头** @param packet    packet* @param packetLen packetLen*/private void addADTSHeader(byte[] packet, int packetLen) {int profile = 2; // AACint freqIdx = 4; // 44.1kHzint channelCount = 2;//声道packet[0] = (byte) 0xFF;packet[1] = (byte) 0xF9;packet[2] = (byte) (((profile - 1) << 6) + (freqIdx << 2) + (channelCount >> 2));packet[3] = (byte) (((channelCount & 3) << 6) + (packetLen >> 11));packet[4] = (byte) ((packetLen & 0x7FF) >> 3);packet[5] = (byte) (((packetLen & 7) << 5) + 0x1F);packet[6] = (byte) 0xFC;}
}

【说明和注意事项】

1、AAC文件有两种添加头文件方式:ADIF与ADTS,此处使用ADTS方式,ADTS是每一段编码都有一个头部,因此并不能只添加一次,需要在回调中添加头文件;添加头文件保存的aac文件可以直接播放;

2、format中需要设置FRAME_RATE,即fmt.putIntValue(Format.FRAME_RATE, 30);,数值必须大于0,否则可能会编码失败

3、编解码功能建议在子线程中执行,不要在主线程中。

【参考文档】

视频编解码文档:文档中心:视频编码

相关文章:

【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)

【关键字】 音频编码、管道模式、createEncoder 【写在前面】 在使用API6开发HarmonyOS应用时&#xff0c;如何将pcm源文件进行编码并写入文件&#xff0c;最后生成aac文件&#xff0c;本文直接附上主要代码开发步骤供大家参考。 【主要功能代码】 import ohos.media.codec.…...

KaiwuDB CTO 魏可伟:回归用户本位,打造“小而全”的数据库

8月16日&#xff0c;KaiwuDB 受邀亮相第十四届中国数据库技术大会 DTCC 2023。KaiwuDB CTO 魏可伟接受大会主办方的采访&#xff0c;双方共同围绕“数据库架构演进、内核引擎设计以及不同技术路线”展开深度探讨。 以下是采访的部分实录 ↓↓↓ 40 多年前&#xff0c;企业的数…...

行业追踪,2023-08-22

自动复盘 2023-08-22 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…...

浏览器安装selenium驱动,以Microsoft Edge安装驱动为例

Selenium是一个用于Web应用程序测试的自动化工具。它可以直接在浏览器中运行&#xff0c;模拟真实用户对浏览器进行操作。利用selenium&#xff0c;可以驱动浏览器执行特定的动作&#xff0c;比如&#xff1a;点击、下拉等等&#xff0c;还可以获取浏览器当前呈现的页面的源代码…...

边缘计算网关是如何提高物联网的效率的?

随着物联网的持续发展&#xff0c;物联网应用的丰富和规模的扩大&#xff0c;带来了海量的数据处理、传输和计算需求。 传统的“数据中央处理”模式越来越难以适应物联网的扩展速度&#xff0c;在这一趋势下&#xff0c;边缘计算在物联网系统的部署运营中就发挥出了显著的增效…...

AWVS安装~Windows~激活

目录 1.下载安装包 2.双击acunetix_15.1.221109177.exe进行安装 3.配置C:\Windows\System32\drivers\etc\hosts 4.复制wvsc.exe到C:\Program Files (x86)\Acunetix\15.1.221109177下 5.复制license_info.json与wa_data.dat到C:\ProgramData\Acunetix\shared\license下&…...

ATFX汇市:杰克逊霍尔年会降至,鲍威尔或再发鹰派言论

环球汇市行情摘要—— 昨日&#xff0c;美元指数下跌0.11%&#xff0c;收盘在103.33点&#xff0c; 欧元升值0.22%&#xff0c;收盘价1.0898点&#xff1b; 日元贬值0.58%&#xff0c;收盘价146.23点&#xff1b; 英镑升值0.18%&#xff0c;收盘价1.2757点&#xff1b; 瑞…...

Zipkin开源的分布式链路追踪系统

Zipkin是一款开源的分布式链路追踪系统,主要功能包括: 1. 采集跟踪数据 - Zipkin client库负责收集并上报各服务的请求信息。 2. 存储跟踪数据 - 存储层默认采用Zipkin自带的基于内存的快速存储,也支持整合MySQL、Cassandra等外部存储。 3. 查询接口 - 提供RESTful API进行跟…...

java 项目运行时,后端控制台出现空指针异常---java.lang.NullPointerException

项目场景&#xff1a; 提示&#xff1a;这里简述项目背景&#xff1a; 场景如下&#xff1a; java 项目运行时&#xff0c;后端控制台出现如下图所示报错信息&#xff1a;— 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; java 项目运行时&#xff0c;后…...

模型数据处理-数据放入 session和@ModelAttribute 实现 prepare 方法详细讲解

&#x1f600;前言 本文详细讲解了模型数据处理-数据放入 session和ModelAttribute 实现 prepare 方法详细讲解 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c…...

关于android studio 几个简单的问题说明

自信是成功的第一步。——爱迪生 1. android studio 如何运行不同项目是否要更换不同的sdk 和 gradle 2.编译Gradle总是错误为什么 3.如何清理android studio 的缓存 4. 关于android Studio中的build 下面的rebuild project...

angular常用命令

文章目录 1. 创建新项目&#xff1a;2. 生成组件&#xff1a;3. 生成模块&#xff1a;4. 生成服务&#xff1a;5. 运行项目&#xff1a;6. 构建项目&#xff1a;其他 在 Angular 开发中&#xff0c;以下是一些常用的 Angular CLI 命令&#xff1a; 1. 创建新项目&#xff1a; …...

uni-app打包后安卓不显示地图及相关操作详解

新公司最近用uni-app写app&#xff0c;之前的代码有很多问题&#xff0c;正好趁着改bug的时间学习下uni-app。 问题现象&#xff1a; 使用uni-app在浏览器调试的时候&#xff0c;地图是展示的&#xff0c;但是打包完成后&#xff0c;在app端是空白的。咱第一次写app&#xff…...

elelementui组件

一、按钮 1、按钮样式 使用type、plain、round和circle属性来定义 Button 的样式。 2、主要代码 <el-row><el-button>默认按钮</el-button><el-button type"primary">主要按钮</el-button><el-button type"success">…...

什么是安全测试报告,怎么获得软件安全检测报告?

安全测试报告 软件安全测试报告&#xff1a;是指测试人员对软件产品的安全缺陷和非法入侵防范能力进行检查和验证的过程&#xff0c;并对软件安全质量进行整体评估&#xff0c;发现软件的缺陷与 bug&#xff0c;为开发人员修复漏洞、提高软件质量奠定坚实的基础。 怎么获得靠谱…...

JS中的Ajax

封装原生 Ajax 请求 在 JavaScript 中&#xff0c;可以通过封装原生的 Ajax 请求来进行与服务器的数据交互。下面是一个封装了原生 Ajax 请求的示例代码&#xff0c;以及对代码的详细注解。 1.简单的Ajax封装代码 <h2>ajax原生</h2><script>//1.创建xhr对象…...

ImportError: cannot import name ‘SQLDatabaseChain‘ from ‘langchain‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

npm、yarn和pnpm

1 node_modules安装方式 在npm3之前是以嵌套结构方式安装依赖包&#xff0c;存在两个问题&#xff1a; 依赖路径太长多个包依赖一个相同包时&#xff0c;本地磁盘会存储多个相同的包 npm3和yarn使用扁平化结构&#xff0c;node_modules变成所有包放在同一层级 注意&#xf…...

SparkSQL源码分析系列02-编译环境准备

本文主要描述一些阅读Spark源码环境的准备工作&#xff0c;会涉及到源码编译&#xff0c;插件安装等。 1. 克隆代码。 打开IDEA&#xff0c;在Git下的Clone中&#xff0c;输入 https://github.com/apache/spark&#xff0c;克隆代码到本地&#xff0c;CheckOut到目标版本Spar…...

【计算机网络】日志与守护进程

文章目录 日志日志的创建logmessage 函数日志左边部分实现日志右边部分实现 完整代码log.hpp(整体实现)err.hpp (错误信息枚举&#xff09; 守护进程PGID SID TTY 的介绍shell中控制进程组的方式结论 为什么要有守护进程存在&#xff1f;守护进程的创建使用守护进程的条件守护进…...

从协议到代码:用Python仿真5G NR下行同步全流程(含PBCH解码与MIB解析)

从协议到代码&#xff1a;用Python仿真5G NR下行同步全流程&#xff08;含PBCH解码与MIB解析&#xff09; 在通信系统设计中&#xff0c;下行同步是终端接入网络的第一步关键操作。5G新空口(NR)技术引入了更复杂的同步信号结构&#xff0c;这对算法工程师和研究人员提出了更高要…...

【网络安全】什么是漏洞扫描?有哪些功能?

【网络安全】什么是漏洞扫描&#xff1f;有哪些功能&#xff1f; 一、什么是漏洞扫描&#xff1f; 漏洞扫描是指基于CVE、CNVD、CNNVD 等漏洞数据库&#xff0c;通过专用工具扫描手段对指定的远程或者本地的网络设备、主机、数据库、操作系统、中间件、业务系统等进行脆弱性评估…...

非确定有限自动机—计算机等级考试—软件设计师考前备忘录—东方仙盟

1. 先明确&#xff1a;圆圈里的数字是什么&#xff1f;圆圈里的 0,1,2,3,4,5 是状态编号&#xff0c;不是输入符号&#xff0c;也不是要识别的字符串内容。比如 状态0 是起始状态&#xff0c;状态5 是终止&#xff08;接受&#xff09;状态。箭头边上的 0,1,ε 才是输入符号&am…...

构建可复用技能库:从代码片段到自动化工作流的工程实践

1. 项目概述&#xff1a;从零构建一套可复用的“副爪”技能库在技术社区里&#xff0c;我们常常会看到一些零散的代码片段、脚本工具或者临时的解决方案&#xff0c;它们像散落的“爪子”一样&#xff0c;能解决特定问题&#xff0c;但不成体系&#xff0c;难以复用和传承。我自…...

STK Astrogator模块避坑指南:从Target Sequence优化失败到成功收敛的5个关键设置

STK Astrogator模块避坑指南&#xff1a;从Target Sequence优化失败到成功收敛的5个关键设置 轨道优化是航天任务设计中的关键环节&#xff0c;而STK的Astrogator模块作为行业标准工具&#xff0c;其Target Sequence功能既能实现复杂机动规划&#xff0c;也常因参数设置不当导致…...

时间序列预测总翻车?试试用Python实现嵌套交叉验证来守住‘未来’数据

时间序列预测中的嵌套交叉验证&#xff1a;用Python守住数据的时间壁垒 当你在预测下周的销售额、下个月的电力负荷或明天的股价时&#xff0c;最可怕的不是模型不够复杂&#xff0c;而是它偷偷"作弊"了——通过窥探未来的数据来假装自己很聪明。这种时间序列预测中的…...

AI工具搭建自动化视频生成Quick Sync

# Quick Sync&#xff1a;AI驱动的自动化视频生成技术实战解析 前阵子团队接了个批量短视频生成的项目&#xff0c;要在短时间内产出数百条产品演示视频。一开始想着一个个用Premiere剪&#xff0c;但算算时间&#xff0c;光是渲染就够呛。后来试用了几种自动化方案&#xff0c…...

从零到一:联想小新Air14 2020锐龙版Windows 10重装实战指南

1. 为什么需要重装系统&#xff1f; 最近有不少朋友跟我吐槽&#xff0c;说用了两年的联想小新Air14 2020锐龙版越来越卡&#xff0c;开机要等半天&#xff0c;打开个文档都要转圈圈。这种情况我太熟悉了&#xff0c;作为一个帮朋友修过不下20台同款机型的老司机&#xff0c;我…...

用Wireshark和Python脚本‘解剖’USB协议:一步步解析Device Qualifier Descriptor抓包数据

用Wireshark和Python脚本深度解析USB协议中的Device Qualifier Descriptor USB协议作为现代设备连接的标准之一&#xff0c;其底层通信机制对开发者而言既是挑战也是机遇。当我们面对一个支持多种速度模式的USB设备时&#xff0c;理解其在不同速率下的行为差异显得尤为重要。本…...

隐私优先的API密钥泄露检测工具:compromising-position设计与实战

1. 项目概述&#xff1a;一个帮你确认API密钥是否已泄露的隐私优先工具最近在开发者圈子里&#xff0c;一个叫OpenClaw的技能市场平台因为安全漏洞闹得沸沸扬扬&#xff0c;据说有几万个API密钥被泄露了。安全公告总是千篇一律地告诉你“请立即轮换你的密钥”&#xff0c;但说实…...