这几天没事研究音频玩 
比如 X配音app的配音功能 录一段 pcm或者wav格式的文件 替换mp4指定位置的音频
刚开始卡在 pcm混合以及pcm指定位置插入。
思路
  一段段的视频进行切割
   用到MP4Code 和 Android转码的一个依赖库 后面附上地址
能实现,但是每次都要切割 感觉太耗性能了。
后来 反编译 X配音的 发现他是从pcm入手 并没有做切割 基于Mp4Parse一个依赖库进行封装完成的
废话不多说 直接上工具类。 public class FFmpegUtil { private FFmpeg ffmpeg;
public FFmpegUtil(Context context) {
if(null==ffmpeg)
ffmpeg=FFmpeg.getInstance(context);
} /**
* 指定位置 合并录音文件 支持 AAC 测试过
* @param totalFile 较长的文件
* @param tempFile 要插入替换的文件
* @param delayTiem 延时插入的位置
* @param duration 较长文件的时间
* @param outputFile 新的录音文件输出目录
*/
public void mergeAudio(String totalFile,String tempFile,int delayTiem,double duration,String outputFile,ExecuteBinaryResponseHandler responseHandler){
try {
File file = new File(outputFile);
if(file.exists()){
file.delete();
}
String cmd = "-i "+totalFile+" -i "+tempFile+" -filter_complex [1:a]adelay="+delayTiem+"|"+delayTiem+"[eff];[0:a][eff]amix[mix];[mix]atrim=duration="+duration+ " "+outputFile;
Log.d("打印出的字符串是", "mergeAudio: "+cmd);
String[] command = cmd.split(" ");
ffmpeg.execute(command, responseHandler);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 分离视频流
*/
public void getAudioFMp4(String input_file,String output_file_audio,ExecuteBinaryResponseHandler responseHandler){
try {
File file = new File(output_file_audio);
if(file.exists()){
file.delete();
}
String cmd = "-i "+input_file+" -vcodec copy -an "+output_file_audio;
Log.d("打印出的字符串是", "getAudioFMp4: "+cmd);
String[] command = cmd.split(" ");
ffmpeg.execute(command, responseHandler);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* wav转 aac
*/
public void getAacFWav(String input_file,String output_file_audio,ExecuteBinaryResponseHandler responseHandler){
try {
/*File file = new File(output_file_audio);
if(file.exists()){
file.delete();
}*/
if(ffmpeg.isFFmpegCommandRunning()){
ffmpeg.killRunningProcesses();
}
String cmd = "-i "+input_file+" -codec:a aac "+output_file_audio;
Log.d("打印出的字符串是", "getAacFWav: "+cmd);
String[] command = cmd.split(" ");
ffmpeg.execute(command, responseHandler);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 获取视频信息
*/
public void getAACInfo(String input_file, ExecuteBinaryResponseHandler responseHandler){
try { String cmd = "-i "+input_file+" -f null";
Log.d("打印出的字符串是", "getAACInfo: "+cmd);
String[] command = cmd.split(" ");
ffmpeg.execute(command, responseHandler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
compile 'com.github.adrielcafe:AndroidAudioConverter:0.0.8'

抱歉 今天赶着去见女朋友。 后面等项目完毕 会补充完善。欢迎加群讨论。
521039620 群主很热心 欢迎交流指正学习讨论。 =================
2017年 3月28日 补记 关于上面的需求 还是没有很好地处理
设计到aac 编码解码耗时的问题。准备从pcm 裸数据入手。
欢迎加群讨论 有什么好的建议 欢迎指正 谢谢~ =================
2017年 10/26号补记 :
这段时间有空一直在找优化方法 奈何能力精力有限
前段时间编译 X配音app 发现他们貌似使用声网 sdk做的。 现在换了种思路 切割 追加音频文件 完成之后会提交解决办法 欢迎交流和指正~ 谢过

Android&Go,Let's go

FFmpegUtil的更多相关文章

  1. 微信小程序语音与讯飞语音识别接口(Java)

    项目需求,需要使用讯飞的语音识别接口,将微信小程序上传的录音文件识别成文字返回 而微信小程序上传的文件格式是silk的,而讯飞接口能识别wav 格式的文件,所以需要将小程序上传的silk文件转成wav ...

  2. 上传视频使用ffmpeg自动截取缩略图

    上传视频之后,有的需要显示缩略图,而不是仅仅显示视频名称的列表,这时候就需要对上传的视频截取缩略图. 简单粗暴点,将以下代码作为工具类复制粘贴即可: package com.util; import ...

  3. 微信小程序语音与讯飞语音识别接口(Java),Kronopath/SILKCodec,ffmpeg处理silk,pcm,wav转换

    项目需求,需要使用讯飞的语音识别接口,将微信小程序上传的录音文件识别成文字返回 首先去讯飞开放平台中申请开通语音识别功能 在这里面下载sdk,然后解压,注意appid与sdk是关联的,appid在初始 ...

  4. FFmpeg在JAVA中的使用-音频提取&字幕压缩

    由于项目需求中涉及到视频中音频提取,以及字幕压缩的功能,一直在研究ffmpeg,仅仅两个功能,却深受ffmpeg的折磨. 今天谈谈ffmpeg在java中的简单使用,首先下载FFmpeg包,官方地址: ...

  5. jquery文件上传控件 WebUploader

    WebUploader是百度开源的一个文件上传组件,因为其操作简洁大方,就在项目中使用了,记录一下. 效果是这样子:  这个样子是默认的效果.  这个是选择上传的图片,可以批量,选择后可以删除和添加更 ...

  6. 在java中使用FFmpeg处理视频与音频

    FFmpeg是一个非常好用的视频处理工具,下面讲讲如何在java中使用该工具类. 一.首先,让我们来认识一下FFmpeg在Dos界面的常见操作 1.拷贝视频,并指定新的视频的名字以及格式 ffmpeg ...

随机推荐

  1. 正则表达式、Calendar类、SimpleDateFormat类、Date类、BigDecimal类、BigInteger类、System类、Random类、Math类(Java基础知识十四)

    1.正则表达式的概述和简单使用 * A:正则表达式(一个字符串,是规则)     * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. * B: ...

  2. codeforces 441B. Valera and Fruits 解题报告

    题目链接:http://codeforces.com/problemset/problem/441/B 题目意思:有 n 棵fruit trees,每课水果树有两个参数描述:水果成熟的时间和这棵树上水 ...

  3. oracle:rman恢复----通过时间set until time

    试验计划:先做一个0级备份,再创建一个表,插入几条数据,最后删除表,然后通过rman把该表的数据恢复. 试验环境:在归档模式,oracle10.2.0.1 开始试验: 1.rman level 0备份 ...

  4. 【hyddd驱动开发学习】DDK与WDK

    最近尝试去了解WINDOWS下的驱动开发,现在总结一下最近看到的资料. 1.首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK ...

  5. linux下ping不通的解决方法

    转自:https://blog.csdn.net/weixin_33400820/article/details/80227702 今天在做练习的时候,发现如何都无法ping通外网,在经过各种网络求助 ...

  6. 2.28 MapReduce在实际应用中常见的优化

    一.优化的点 Reduce Task Number Map Task输出压缩 Shuffle Phase 参数 map.reduce分配的虚拟CPU 二.Reduce Task Number Redu ...

  7. node+pjax实现不刷新跳转

    做前端的都知道如果通过a标签去访问跳转到某一个页面,浏览器会自动刷新.那么如何实现不刷新跳转? html5的出现让我们可以实现不刷新跳转页面.主要使用的方法:history.pushState(dat ...

  8. HDU6035:Colorful Tree(树形DP)

    传送门 题意 给出一棵最小生成树及每个节点的颜色,询问\(\frac{n(n-1)}2\)条路径的权值和,一条路径的权值为该路径的颜色种数 分析 勉强理解了ftae的做法,但是代码还是不太会,还是太弱 ...

  9. LIS LCS LCIS (主要过一遍,重在做题)

    只详细讲解LCS和LCIS,别的不讲-做题优先. 菜鸟能力有限写不了题解,可以留评论,我给你找博客. 先得理解最长上升子序列吧,那个HDOJ拦截导弹系列可以做一下,然后用o(n)log(n)的在做一遍 ...

  10. 骨骼蒙皮动画(Skinned Mesh)的原理解析(二)

    http://blog.csdn.net/jimoshuicao/article/details/9283071 2)蒙皮信息和蒙皮过程 2-1)Skin info的定义 上文曾讨论过,Skinned ...