zoukankan      html  css  js  c++  java
  • FFmpegUtil

    这几天没事研究音频玩 
    比如 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

  • 相关阅读:
    Ngnix(三)—— window下布置nginx服务集群
    Java基础(一)—— 网络编程(一)—— Java Socket总结
    2018新浪Java笔试总结
    java yyyyMMddHHmmss格式字符串转换为yyyy-MM-dd HH:mm:ss格式字符串
    c# 返回多个参数(利用Tuple)
    c# 域名转换成ip地址
    myhaits if test判断字符串
    java中List转换成Json
    java打包发布程序.jar(Eclipse)
    redis设置密码
  • 原文地址:https://www.cnblogs.com/yizuochengchi2012/p/6439257.html
Copyright © 2011-2022 走看看