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

音频格式转换

一、场景

项目需求需要App实现声纹识别功能,调用科大讯飞接口:

声纹识别 API 文档 | 讯飞开放平台文档中心

其接口要求音频文件格式为mp3

二、问题产生

在安卓端根据官方文档说明,系统并不支持直接录制mp3格式音频,支持格式如下:

支持的媒体格式  |  Android media  |  Android Developers

苹果端也有类似情况:

Documentation Archive 

简单来说,移动端系统支持pcm 或者 wav 这种原始音频文件信息,文件比较大,而科大讯飞接口需要提供压缩后文件比较小的mp3格式音频,因此就需要进行转换处理了。

 

三、功能实现

刚开始在安卓端查到的资料大多为使用lame库来进行转换处理:
Android集成LAME库,实现pcm转mp3_安卓lame-CSDN博客

但是看到这种需要NDK 开发,并且这个功能以后也不常用,对于框架的维护起来比较麻烦。所以想着换个思路,是否让后端来进行这个转换工作,因为苹果端以后也要进行转码操作,如果java后端实现了,则可以免去移动端两端的烦恼。

查询java端的思路也还是使用lame库或者ffmpeg 库,但是找到几个开源库都是这种star很少的,例如:

https://blog.csdn.net/Fan_1504251998/article/details/126345408

然后应用时不成成功,报各种错误,无法正常转换。

找到一个star 多一点也是如此,例如:

GitHub - a-schild/jave2: The JAVE (Java Audio Video Encoder) library is Java wrapper on the ffmpeg project

 

就在这种反复尝试无果时,又问了下大模型,给出的其他方案中有使用ffmpeg 转码的,于是想到了之前自己在增加视频关键帧时,曾经下载用命令尝试过,于是查了一下音频转码的命令:

ffmpeg -y -f 采样格式 -ac 声道数 -ar 采样率 -acodec pcm_s16le -i PCM源文件 MP3目标文件

将安卓端录制的pcm音频文件放置到了工具目录下运行:

ffmpeg.exe -y -f s16be -ac 1 -ar 16000 -acodec pcm_s16le -i test_audio.pcm converted.mp3

转换出来的mp3文件能够正常播放,并且使用科大讯飞接口能够成功进行调用。

于是格局打开,思路豁然开朗,感觉大有可为。

继续查询安卓端是否可以直接使用ffmpeg库,而不需要想lame 那样的NDK开发方式,GPT给出了如下引用库:    implementation 'com.arthenica:ffmpeg-kit-full:5.1.LTS'

使用方式:

 String command = String.format("-y -f s16be -ac 1 -ar 16000 -acodec pcm_s16le -i %s %s",wavPath, mp3Path);

        FFmpegSession session = FFmpegKit.execute(command);

        if (session.getReturnCode().isSuccess(session.getReturnCode())) {
            Log.d("FFmpeg", "WAV to MP3 conversion successful");
        } else {
            Log.e("FFmpeg", "WAV to MP3 conversion failed: " + session.getFailStackTrace());
        }

实现了安卓端的音频mp3转换 


http://www.kler.cn/a/396672.html

相关文章:

  • JavaSE常用API-日期(计算两个日期时间差-高考倒计时)
  • nginx反向代理上游服务器主从配置
  • Tiktok对接和内容发布申请流程
  • 让空间计算触手可及,VR手套何以点石成金?
  • 【route】route add命令详解
  • sealos部署K8s,安装docker时master节点突然NotReady
  • 索引及练习
  • thinkphp6配置多应用项目及多域名访问路由app配置
  • 深度学习每周学习总结J5(DenseNet-121 +SE 算法实战与解析 - 猴痘识别)
  • Java事务
  • 制作图片马常用的五种方法总结
  • 【AI协作】让所有用电脑的场景都能在ChatGPT里完成。Canvas :新一代可视化交互,让AI易用易得
  • 新手小白学习docker第八弹------实现MySQL主从复制搭建
  • tauri开发中,使用node将png图片转成苹果的icns图标格式,解决tauri icon生成的mac图标过大问题
  • 高级java每日一道面试题-2024年11月07日-Redis篇-Redis有哪些功能?
  • 演员王子辰—专注革命题材 《前行者》后再出发
  • 【软考】系统架构设计师-计算机系统基础(3):嵌入式系统
  • 搭建 PostgreSQL 主从架构
  • ElementUI的日期组件中禁止选择小时、分钟、秒
  • 卡尔曼滤波:从理论到应用的简介
  • Android 中线程网络超时的处理
  • 缓存及其不一致
  • Yocto - 使用Yocto开发嵌入式Linux系统_13 创建定制层
  • 什么是 Go 语言?
  • 【计算机体系架构】 MESI缓冲一致性
  • 力扣每日一题 3261. 统计满足 K 约束的子字符串数量 II