1.背景
最近对接了一款智能手表,手环,可以应用与老人与儿童监控,环卫工人监控,农场畜牧业监控,宠物监控等,其中用到了音频传输,通过平台下发语音包,发送远程命令录制当前设备音频并将音频分包传输到服务器上生成音频文件等。其中关于音频的一些简单操作封装成了工具包。
2.音频工具包
引入jaudiotagger,用来获取MP3格式的音频时长。
org
jaudiotagger
2.0.1
工具包代码: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 };
RandomAcc服务器托管网essFile 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 0 ? ((length - 6) / 650) : 0;
break;
}
packedPos = (datas[0] >> 3) & 0x0F;
pos += packedSize[packedPos] + 1;
frameCount++;
}
// 帧数*20
duration += 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:UsersMyPCDesktop卡布奇诺-王逗逗.mp3";
int duration = getMp3Duration(new File(path));
System.out.println(duration);
}
}
致力于物联网应用开发,目前有一套成熟的物联网底层服务与物联网设备管理系统,并提供API,WebHook,MQTT实现将数据实时有效的推送到客户的云平台,助力客户完成自己的SaaS平台开发。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
option java_multiple_files = true; 作用和意义:此选项指示生成的 Java 代码将被分割成多个文件而不是一个文件。每个消息类型都会生成一个单独的 Java 类文件。 示例:如果有两个消息类型:MessageA 和 Messag…