linux下微信/qq的aud、silk音频文件格式与mp3格式互转,获取音频时长的方法,附问题分析和java代码。

安装ffmpeg

ffmpeg -codecs

—可以看出ffmpeg默认的MP3格式无法编码为其它格式【D.A.L mp3】D=解码 E=编码 A=AudioCodec L=有损压缩

需要安装lame服务使得MP3具有编码为其他格式的功能

参考:https://blog.csdn.net/zhaofengdeng/article/details/79413330

微信/qq所需要的音频文件为Silk v3格式,Silk v3格式有占用空间小的特点,如amr、aud、slk、silk都是Silk v3的格式

MP3->PCM->SILK,这个过程叫做silk v3的解码(也是mp3的编码)

SILK->PCM->MP3,这个过程叫做Silk v3的编码

中间格式PCM是一个类似WAV的文件格式。

详解:MP3->PCM->SILK

1、 MP3->PCM 使用ffmpeg转换

ffmpeg -y -i {源文件.mp3} -f s16le -ar 24000 -ac 1 {目标文件.pcm}
参数:-y 强制覆盖
-i 输入文件
-f s16le 转换格式 s16le=(PCM signed 16-bit little-endian), s16be=(PCM signed 16-bit big-endian)
-ar 24000 频率Hz,默认的微信音频频率是24000(set audio sampling rate (in Hz))
-ac 1 频道数,(set number of audio channels)

2、 PCM->SILK 使用kn007的开源项目Silk2MP3转换(需要编译encoder)

/usr/webser/silk-v3-decoder/silk/encoder {源文件.pcm} {目标文件.silk} -tencent

参考:https://github.com/kn007/silk-v3-decoder

同理 SILK->PCM->MP3

1、 SILK->PCM 使用Silk2MP3转换

/usr/webser/silk-v3-decoder/silk/decoder {源文件.silk} {目标文件.pcm} -tencent

2、 PCM->MP3 使用ffmpeg转换

ffmpeg -y -ac 1 -ar 16000 -f s16le -i {源文件.pcm} -c:a libmp3lame -q:a 2 {目标文件.mp3}

获取音频时长

使用jave,不赘诉

参考:https://www.cnblogs.com/xxbai1123/p/9718528.html

附:

Silk2MP3编译encoder,(由于该开源项目主要是用于silkv3_decoder,但是encoder有源码,只是需要自己手动编译)

cd /usr/webser/silk-v3/decoder/silk

make encoder

编译完成后encoder即可使用

代码

public static String mp3ToSilk(String source, String path, String audioType) {
		File sourceFile = new File(source);
		if (sourceFile.exists()) {
			String name = sourceFile.getName();
			logger.debug("filename={}", name);
			String pcmPath = path + name + ".pcm";
			logger.debug("pcmPath={}", pcmPath);
			processPcm(path, source, pcmPath);// 先转成pcm格式
			String target = path + name + "." + audioType;
			logger.debug("target={}", target);
			File pcmFile = new File(pcmPath);
			if (pcmFile.exists()) {
				processMp3(path, pcmPath, target);// 再由pcm转成mp3
			} else {
				processFfmpegMp3(path, source, target);// 直接转成mp3
			}
			return target;
		} else {
			logger.error("文件不存在 {}", source);
		}

		return null;
	}

	// 调用sile_v3_encoder,pcm->silk
	private static void processMp3(String path, String source, String target) {
		String command = StringUtils.replaceEach("/usr/webser/silk-v3-decoder/silk/encoder {源文件} {目标文件} -tencent",
				new String[] { "{源文件}", "{目标文件}" }, new String[] { source, target });
		try {
			p = Runtime.getRuntime().exec(command);
			p.waitFor();
		} catch (Exception e) {
			logger.error("执行失败{}", command, e);
		}
	}

	// 调用ffmpeg,mp3->pcm
	private static void processPcm(String path, String source, String target) {
		// ffmpeg -y -i 源文件 -f s16le -ar 24000 -ac 1 目标文件
		String command = StringUtils.replaceEach("ffmpeg -y -i {源文件} -f s16le -ar 24000 -ac 1 {目标文件}",
				new String[] { "{源文件}", "{目标文件}" }, new String[] { source, target });
		try {
			p = Runtime.getRuntime().exec(command);
			p.waitFor();
		} catch (Exception e) {
			logger.error("执行失败{}", command, e);
		}
	}

	// 调用ffmpeg,mp3->silk
	private static void processFfmpegMp3(String path, String source, String target) {
		String command = StringUtils.replaceEach("ffmpeg -i {源文件} {目标文件}", new String[] { "{源文件}", "{目标文件}" },
				new String[] { source, target });
		try {
			p = Runtime.getRuntime().exec(command);
			p.waitFor();
		} catch (Exception e) {
			logger.error("执行失败{}", command, e);
		}
	}
	

	public static Long getMp3VoiceLen(String source) {
		File sourceFile = new File(source);
		if (sourceFile.exists()) {
			Encoder encoder = new Encoder();
			long ls = 0;
			MultimediaInfo m;
			try {
				m = encoder.getInfo(sourceFile);
				ls = m.getDuration();

			} catch (Exception e) {
				logger.error("获取音频时长有误:{}", source, e);
			}
			return ls;
		} else {
			logger.error("文件不存在 {}", source);
		}

		return 0L;
	}

在此再次感谢kn007提供的转换包:https://github.com/kn007/silk-v3-decoder

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
原理非常简单,所谓Aud文件,其实就是Amr文件,但不能播放的原因,就是它是去掉了文件头的Amr文件 大家可以把Aud文件用记本打开,在文件开头加入#!AMR,然后保存为Amr文件格式即可播放。 如果试了不行的话,请下载Notepad++,打开Aud文件,在内容前加上#!AMR,然后保存为UNIX格式的Amr文件即可。 以上就是方法,如果懂技术的可以编写成软件或脚本,如果不会的,也可下载我提供的小软件,批量换,谢谢各位对此帖的支持,谢谢!! 或者下载我做好的一个记事本文件,里面就是Amr文件头,大家可以下载后,用cmd命令执行: copy Audhead.txt/b + xxxx.aud/b result.amr 就可以得到正常的Amr文件,xxxx.aud 为你的aud文件名 由于我和老婆孩子不在一起,经常通过微信聊天,儿子刚学会了叫爸爸,超开心啊 忽然想怎么能把儿子在微信上的录音记录下来,结果导出来时是aud文件,根本无法播放。 在网上也寻找了很多方法,都相当的复杂,所以就干脆自己动手编写了一个小程序。 没啥技术含量,但绝对的简单方便,方法见下图,别不多说,各位觉着好用,给点支持,谢谢!! 3月27日晚更新1.0:解决中文目录无法生成amr文件 换后的amr文件可用QQ影音等软件播放的哦 顺便提一下微信的语音文件导出方法: 可以用iTools导出,见下图: 左边这些乱码文件夹,就是和你聊天的朋友名,点击一个后,右边就是和此人聊天的aud文件 如若发现有Bug请回复提出,我会及时修复. 选择需要换的微信aud语音文件: 自动完成换: 生成同名文件在同目录中: 可拖放文件到软件窗口(可批量的哦)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值