Android Wav音频文件裁剪
最近项目遇到了音频处理的问题,找了很久没找到合适android用的,最后改动了一下某位大佬的代码,放到项目里还是能用的,记录一下/*** 开始裁剪** @param start 开始时间(毫秒)* @param end 结束时间(毫秒)* <p>* return 截取成功返回true,否则返回false*/
public static boolean cut(String sourcefile, String targetfile, int start, int end) {try {if (!sourcefile.toLowerCase().endsWith(".wav") || !targetfile.toLowerCase().endsWith(".wav")) {return false;}File wav = new File(sourcefile);if (!wav.exists()) {return false;}long t1 = getWavLength(wav); //总时长(秒)if (start < 0 || end <= 0 || start >= t1 || end > t1 || start >= end) {return false;}FileInputStream fis = new FileInputStream(wav);long wavSize = wav.length() - 44; //音频数据大小(44为128kbps比特率wav文件头长度)long splitSize = (wavSize / t1) * (end - start); //截取的音频数据大小long skipSize = (wavSize / t1) * start; //截取时跳过的音频数据大小int splitSizeInt = Integer.parseInt(String.valueOf(splitSize));int skipSizeInt = Integer.parseInt(String.valueOf(skipSize));ByteBuffer buf1 = ByteBuffer.allocate(4); //存放文件大小,4代表一个int占用字节数buf1.putInt(splitSizeInt + 36); //放入文件长度信息byte[] flen = buf1.array(); //代表文件长度ByteBuffer buf2 = ByteBuffer.allocate(4); //存放音频数据大小,4代表一个int占用字节数buf2.putInt(splitSizeInt); //放入数据长度信息byte[] dlen = buf2.array(); //代表数据长度flen = reverse(flen); //数组反转dlen = reverse(dlen);byte[] head = new byte[44]; //定义wav头部信息数组fis.read(head, 0, head.length); //读取源wav文件头部信息for (int i = 0; i < 4; i++) { //4代表一个int占用字节数head[i + 4] = flen[i]; //替换原头部信息里的文件长度head[i + 40] = dlen[i]; //替换原头部信息里的数据长度}byte[] fbyte = new byte[splitSizeInt + head.length]; //存放截取的音频数据for (int i = 0; i < head.length; i++) { //放入修改后的头部信息fbyte[i] = head[i];}byte[] skipBytes = new byte[skipSizeInt]; //存放截取时跳过的音频数据fis.read(skipBytes, 0, skipBytes.length); //跳过不需要截取的数据fis.read(fbyte, head.length, fbyte.length - head.length); //读取要截取的数据到目标数组fis.close();File target = new File(targetfile);if (target.exists()) { //如果目标文件已存在,则删除目标文件target.delete();}FileOutputStream fos = new FileOutputStream(target);fos.write(fbyte);fos.flush();fos.close();} catch (IOException e) {e.printStackTrace();return false;}return true;
}/*** 根据MediaPlayer获取wav音频时长 ms** @return*/
public static long getWavLength(File file) {MediaPlayer player = new MediaPlayer();try {player.setDataSource(file.getPath()); //recordingFilePath()为音频文件的路径player.prepare();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}long duration = player.getDuration();//获取音频的时间Log.d("ACETEST", "### duration: " + duration);player.release();//记得释放资源return duration;
}/*** 数组反转** @param array*/
public static byte[] reverse(byte[] array) {byte temp;int len = array.length;for (int i = 0; i < len / 2; i++) {temp = array[i];array[i] = array[len - 1 - i];array[len - 1 - i] = temp;}return array;
}
最后如果有兴趣的可以关注一下我的公众号吧,虽然很菜,但是还是渴望成长
Android Wav音频文件裁剪相关推荐
- android 字节转wav,android开发:把一个byte数组转换成wav音频文件,并且播放
============问题描述============ 如题,byte数组转换成wav音频文件,并且播放,下面代码能生成data/data/com.example.playwav/cache/tem ...
- Java程序获取和修改.wav音频文件的内部结构
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/79498075冷血之心的博客) wav音频文件是一种无损的音频文件, ...
- android ios 音频寻,多媒体-iOS与Android的音频文件互通
前言 在实际的开发中,关于音频的传输上,iOS与Android的通用性一直是一个不可回避的问题.下面记录下比较好的解决方案. 现状 苹果的音频格式安卓全不支持. 安卓的音频格式,苹果基本也不支持 解决 ...
- Android 实现音频的裁剪,拼接和混音
Android 实现音频的裁剪,拼接和混音 基本流程 在项目中我们的音频一般都是指的mp3的文件,mp3文件作为一种编码压缩过的文件格式并不能直接对音频的数据进行很好的操作,我们都知道这种压缩过后的文 ...
- 如何用C语言编写wav读取函数,C++读取WAV音频文件的头部数据的实现方法
C++读取WAV音频文件的头部数据的实现方法 前言: 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有 ...
- Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件
第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Begi ...
- c语言 文件 long double 读取,读取*.wav音频文件
1.wav音频文件的格式 wav文件由文件头和采样数据2部分组成. 文件头又分为RIFF(Resource Interchange File Format).WAVE文件标识段 和 声音数据格式说明段 ...
- java 双声道音频_java实现切割wav音频文件的方法详解【附外部jar包下载】
本文实例讲述了java实现切割wav音频文件的方法.分享给大家供大家参考,具体如下: import it.sauronsoftware.jave.Encoder; import it.sauronso ...
- python播放wav文件_python3 写一个WAV音频文件播放器的代码
环境:ubuntu 16.04 python3.5 pycharm 包 : wave pyaudio sys 上代码:AudioPlayer.py # coding:utf-8 # author:ki ...
最新文章
- linux启动时间极限优化,Linux启动时间的极限优化
- CentOS PPTP ×××
- maven 程序包不存在_有人说 Maven 很简单,我却被“伤害”过
- linux中的软RAID实现,逻辑卷和btrfs文件系统
- android 内存占用大 卡顿,安卓手机用久了就会卡顿?那是内存使用率高了,你需要这么做...
- Robotium todolist.test.testcases.logout
- DevExpress.XtraGrid.view.gridview 属性说明
- Spring 入门学习二之IOC
- Codeforces Round #736 (Div. 2)E. The Three Little Pigs-长除法求多项式系数
- 台湾邮政历史常设展重新开幕
- 整合Flask中的目录结构
- http请求后status为canceled处理
- oracle ora12514错误,【ORACLE】提示ORA-12514错误处理
- 聚合函数和group by
- mysql 联合表(federated)及视图
- CSS基础:移动端开发常识,多倍图初始化等
- 威廉玛丽学院计算机专业好吗,威廉玛丽学院商学院BA专业怎么样?
- 事业单位招聘计算机岗位考试题,计算机考试题库:计算机考试练习题(136)
- Android - 分屏模式(多窗口模式)
- NAACL 2019 | ​注意力模仿:通过关注上下文来更好地嵌入单词