=====原创不易,请尊重每一位原创,让我们更有分享的动力,转载请注明=====

转载链接

若有朋友需要WAV 音频裁剪,可以参考我的另外一篇博文——wav 音频裁剪http://blog.csdn.net/daltsoftware/article/details/71480664
在android开发中,一说到音视频,程序员第一反应肯定是FFMpeg,但是FFMpeg这个库,又复杂,又性能差,如果只想简单的要个音频裁剪的功能,就要去引入这么大的库,完全不值得。然而自从android api 16之后谷歌就开始在音视频方面进行布局,android 18之后继续丰富音视频编码库,让很多android app在不依赖于繁琐jni就能进行一些基础的音视频开发。下面将是基于android api16的对mp3文件进行裁剪的代码例子。当前由于时间问题,先分享最主流的mp3格式的音频裁剪,以后有时间会分享更多其他音频方面的经验。

  //适当的调整SAMPLE_SIZE可以更加精确的裁剪音乐private static final int SAMPLE_SIZE = 1024 * 200;@TargetApi(Build.VERSION_CODES.JELLY_BEAN)public static boolean clip(String inputPath, String outputPath, int start, int end){MediaExtractor extractor = null;BufferedOutputStream outputStream = null;try {extractor = new MediaExtractor();extractor.setDataSource(inputPath);int track = getAudioTrack(extractor);if(track < 0){return false;}//选择音频轨道extractor.selectTrack(track);outputStream = new BufferedOutputStream(new FileOutputStream(outputPath), SAMPLE_SIZE);start = start * 1000;end = end * 1000;//跳至开始裁剪位置extractor.seekTo(start, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);while (true){ByteBuffer buffer = ByteBuffer.allocate(SAMPLE_SIZE);int sampleSize = extractor.readSampleData(buffer, 0);long timeStamp = extractor.getSampleTime();// >= 1000000是要裁剪停止和指定的裁剪结尾不小于1秒,否则可能产生需要9秒音频//裁剪到只有8.6秒,大多数音乐播放器是向下取整,这样对于播放器变成了8秒,// 所以要裁剪比9秒多一秒的边界if(timeStamp > end && timeStamp - end >= 1000000){break;}if(sampleSize <= 0){break;}byte[] buf = new byte[sampleSize];buffer.get(buf, 0, sampleSize);//写入文件outputStream.write(buf);//音轨数据往前读extractor.advance();}} catch (IOException e) {e.printStackTrace();}finally {if(extractor != null){extractor.release();}if(outputStream != null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}return true;}/*** 获取音频数据轨道* @param extractor* @return*/@TargetApi(Build.VERSION_CODES.JELLY_BEAN)private static int getAudioTrack(MediaExtractor extractor) {for(int i = 0; i < extractor.getTrackCount(); i++){MediaFormat format = extractor.getTrackFormat(i);String mime = format.getString(MediaFormat.KEY_MIME);if(mime.startsWith("audio")){return i;}}return -1;}

裁剪音乐的步骤在注释中已经写得很明白了,其实用上面简单的代码就能实现音频裁剪了,而且裁剪的音频经过多项硬指标测试是没有问题的。但可能还是有人会怀疑用上述方法是否得到一个“真正”mp3文件。绝大部分情况下,产品经理的需求都是希望裁剪后的音乐除了长度之外,其他的都和原始音频一样,以防不同的播放器由于编解码库的差异,导致播放失败的情况。下面的代码是用来提取音频的关键数据,来比较裁剪之后的音频和原始音频的关键数据是否一样。

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private static void printMusicFormat(String musicPath){try {MediaExtractor extractor = new MediaExtractor();extractor.setDataSource(musicPath);MediaFormat format = extractor.getTrackFormat(getAudioTrack(extractor));Log.i("music", "码率:" + format.getInteger(MediaFormat.KEY_BIT_RATE));Log.i("music", "轨道数:" + format.getInteger(MediaFormat.KEY_CHANNEL_COUNT));Log.i("music", "采样率:" + format.getInteger(MediaFormat.KEY_SAMPLE_RATE));} catch (IOException e) {e.printStackTrace();}
}

通过反复验证,通过以上方法裁剪的音频除了时间长度之外,其他格式数据都和原始音频一样,裁剪的音频在各种平台(android, IOS, windows,mac)都能正常的播放和使用。

android 音频裁剪(1)—MP3裁剪相关推荐

  1. android音频编辑之音频裁剪

    转载请标明出处: http://blog.csdn.net/hesong1120/article/details/79077013 本文出自:hesong的专栏 前言 本篇开始讲解音频编辑的具体操作, ...

  2. android音频资源,android音频编辑之音频裁剪的示例代码

    前言 本篇开始讲解音频编辑的具体操作,从相对简单的音频裁剪开始.要进行音频裁剪,我的方案是开启一个Service服务用于音频裁剪的耗时操作,主界面发送裁剪命令,同时注册EventBus接受裁剪的消息( ...

  3. android音频裁剪(2)——Wav裁剪

    =====原创不易,请尊重每一位原创,让我们更有分享的动力,转载请注明===== 转载链接 在android音频裁剪(1)--MP3裁剪一文中我分享了对mp3文件裁剪方法.在本文中我将分享对另外一种音 ...

  4. android音频编辑之音频裁剪的示例代码

    音频编辑项目的整体结构 音频裁剪方法的流程实现 获取音频文件相关信息 计算裁剪时间点对应文件中数据的位置 写入wav文件头信息 写入wav文件裁剪部分的音频数据 下面是音频裁剪效果图: 音频编辑项目的 ...

  5. Android 3分钟一个库搞定视频替换音频 视频合成 视频裁剪(高仿剪映)

    几种框架的比较: https://www.zhihu.com/question/278431860 方法一(Fail) 利用MediaMux实现音视频的合成. 效果:可以实现音视频的合并,利用Andr ...

  6. android 画布心形,Android CustomShapeImageView对图片进行各种样式裁剪:圆形、星形、心形、花瓣形等...

     Android CustomShapeImageView对图片进行各种样式裁剪:圆形.星形.心形.花瓣形等 Android CustomShapeImageView是github上一个第三方开源 ...

  7. android选择本地图片并裁剪

    本文使用Android原生的选择和裁剪功能.下面是代码: public class PickAndCropActivity extends AppCompatActivity implements V ...

  8. android 内核裁剪概述,Android内核的编译与裁剪

    概述 如果我们仅仅对Android内核感兴趣,我们可以选择合适的Android内核下载并编译. 可供选择的内核源码有很多版本: $ git clone https://android.googleso ...

  9. Android 针对华为手机调用裁剪出现圆形裁剪框的处理

    Android 针对华为手机调用裁剪出现圆形裁剪框的处理 if (Build.MANUFACTURER.equals("HUAWEI")) {intent.putExtra(&qu ...

最新文章

  1. 21.5. 流量控制
  2. linux中运行.pro文件,Linux下pro*c运行配置
  3. 《系统集成项目管理工程师》必背100个知识点-78配置项的版本控制
  4. VTK:Texture之AnimateVectors
  5. C#学习笔记(二)运算符 乘方 判断语句 循环语句 比较运算符 逻辑运算符 数组...
  6. 如何打开eclipse进行编写Java程序
  7. Linux 安装配置JDK 、 MySQL 、nginx
  8. php if a 3 b 5,$a=0; $b=0; if($a=3 || $b=3){ $a++; $b++;} echo $a.”,”.$b;为什么结果是1,1啊...
  9. 未来 10 年,物联网将成为主流!
  10. 【软件工程作业3】DFD数据流图和SC结构图
  11. 关于限流电阻太大,无法通信的问题
  12. coap 返回版本信息_CoAP协议浅析
  13. iPhone没有收到iOS16最新版的推送,如何升级系统?
  14. 使用ps修改图片大小不影响清晰度的方法
  15. API的小结===一定要看
  16. RSF 分布式 RPC 服务框架的分层设计
  17. 动漫人物脸型怎么画?如何画好动漫人物脸型?
  18. 2021年焊工(初级)新版试题及焊工(初级)复审模拟考试
  19. 《梦里花落知多少》-三毛
  20. jquery实现照片墙

热门文章

  1. Linux命令全家桶以及vim/gcc/gdb/makefile/yum
  2. 年末IPO热潮掀起,国际永胜二度冲击港交所
  3. 全国计算机注册时密码为什么老是错误,电脑密码正确却显示密码错误怎么办
  4. 单、多通道图像反差处理
  5. 【Unity】如何删除不要的Tile Palette(瓦片地图)(遇到新的问题就继续更新2021.4.29)
  6. Python爬虫实战之爬取QQ音乐数据
  7. 5G技术的原理(转)
  8. MySQL cluster集群/NDB集群学习
  9. CentOS下修改IRedMail的邮件附件大小
  10. ZOJ Monthly,Feburary 2012 部分题解