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

Java 音频处理,音频流转音频文件,获取音频播放时长

1.背景

最近对接了一款智能手表,手环,可以应用与老人与儿童监控,环卫工人监控,农场畜牧业监控,宠物监控等,其中用到了音频传输,通过平台下发语音包,发送远程命令录制当前设备音频并将音频分包传输到服务器上生成音频文件等。其中关于音频的一些简单操作封装成了工具包。

2.音频工具包

引入jaudiotagger,用来获取MP3格式的音频时长。

        <dependency><groupId>org</groupId><artifactId>jaudiotagger</artifactId><version>2.0.1</version></dependency>

工具包代码:AudioUtils
 

package com.xxxx.common.utils;import lombok.extern.slf4j.Slf4j;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.mp3.MP3AudioHeader;
import org.jaudiotagger.audio.mp3.MP3File;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;/*** 音频处理工具类* @author Mr.Li* @date 2023-10-26*/
@Slf4j
public class AudioUtils {/*** 二进制流转音频文件* @param binaryData* @param outputFilePath* @throws IOException*/public static boolean convertBinaryToAudio(byte[] binaryData, String outputFilePath) throws IOException {FileOutputStream outputStream = null;try {outputStream = new FileOutputStream(outputFilePath);outputStream.write(binaryData);return true;}catch (Exception e){log.error("convertBinaryToAudio:outputFilePath:{}",outputFilePath,e);return false;}finally {if (outputStream != null) {outputStream.close();}}}/*** 获取AMR格式音频长度* @param file* @return* @throws IOException*/public static int getAmrDuration(File file) throws IOException {long duration = -1;int[] packedSize = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0,0, 0 };RandomAccessFile randomAccessFile = null;try {randomAccessFile = new RandomAccessFile(file, "rw");// 文件的长度long length = file.length();// 设置初始位置int pos = 6;// 初始帧数int frameCount = 0;int packedPos = -1;// 初始数据值byte[] datas = new byte[1];while (pos <= length) {randomAccessFile.seek(pos);if (randomAccessFile.read(datas, 0, 1) != 1) {duration = length > 0 ? ((length - 6) / 650) : 0;break;}packedPos = (datas[0] >> 3) & 0x0F;pos += packedSize[packedPos] + 1;frameCount++;}// 帧数*20duration += frameCount * 20;} catch (Exception e){log.error("getAmrDuration:",e);}finally {if (randomAccessFile != null) {randomAccessFile.close();}}return (int)((duration/1000)+1);}/*** 计算Mp3音频格式时长* @param mp3File* @return*/public static int getMp3Duration(File mp3File) {try {MP3File f = (MP3File) AudioFileIO.read(mp3File);MP3AudioHeader audioHeader = (MP3AudioHeader) f.getAudioHeader();return audioHeader.getTrackLength();} catch (Exception e) {log.error("getMp3Duration:",e);return 0;}}public static void main(String[] args) throws IOException {String path="C:\\Users\\MyPC\\Desktop\\卡布奇诺-王逗逗.mp3";int duration = getMp3Duration(new File(path));System.out.println(duration);}
}

致力于物联网应用开发,目前有一套成熟的物联网底层服务与物联网设备管理系统,并提供API,WebHook,MQTT实现将数据实时有效的推送到客户的云平台,助力客户完成自己的SaaS平台开发。

欢迎对物联网感兴趣的朋友加我微信交流学习。

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

相关文章:

  • Spring Boot发送邮件
  • 智慧矿山:AI算法助力!刮板机监测,生产效率和安全性提升!
  • Qt跨平台(统信UOS)各种坑解决办法
  • ORB-SLAM3算法1之Ubuntu18.04+ROS-melodic安装ORB-SLAM3及各种问题解决
  • git学习笔记之用命令行解决冲突
  • C语言中的内联汇编是什么?如何使用内联汇编进行底层编程?
  • react笔记基础部分(组件生命周期路由)
  • Sentinel授权规则和规则持久化
  • JVM(三) 垃圾回收
  • vue3中使用svg并封装成组件
  • 实验六:DHCP、DNS、Apache、FTP服务器的安装和配置
  • Python实验项目4 :面对对象程序设计
  • 用html、css和jQuery实现图片翻页的特效
  • awk 框架
  • 专业135总分400+西安交通大学信息与通信工程学院909/815考研经验分享
  • 在 Windows 用 Chrome System Settings 设置代理
  • Excel多线程导入数据库
  • Linux开机默认进入命令行或图形化模式
  • ajax请求的时候get 和post方式的区别?
  • 还不知道光场相机吗?
  • 软信天成:助力某制造企业建设产品主数据管理平台案例分享
  • C#WPFPrism框架导航应用实例
  • Centos安装gitlabce
  • android8.1- Show virtual keyboard 默认打开
  • 打印机连接网络后怎么安装驱动?
  • 光流法动目标检测
  • 【机器学习合集】泛化与正则化合集 ->(个人学习记录笔记)
  • 软考高级之系统架构师之数据流图和流程图
  • CVPR2023新作:基于组合空时位移的视频修复
  • 我的Windows10下的WSL的使用经历