上一篇文章谈到音频剪切、混音、拼接与转码,也详细介绍cMake配置与涉及FFmpeg文件的导入: android端采用FFmpeg进行音频混合与拼接剪切 。现在接着探讨音视频的合成与分离。

1、音频提取

从多媒体文件中提取音频,关键命令为“-acodec copy -vn”,其中“-acodec copy”是采用音频编码器拷贝音频流,“-vn”是去掉video视频流:

    /*** 使用ffmpeg命令行进行抽取音频* @param srcFile 原文件* @param targetFile 目标文件* @return 抽取后的音频文件*/public static  String[] extractAudio(String srcFile, String targetFile){//-vn:video notString mixAudioCmd = "ffmpeg -i %s -acodec copy -vn %s";mixAudioCmd = String.format(mixAudioCmd, srcFile, targetFile);return mixAudioCmd.split(" ");//以空格分割为字符串数组}

2、视频提取

从多媒体文件中提取视频,关键命令为“-vcodec copy -an”,其中“-vcodec copy”是采用视频编码器拷贝视频流,“-an”是去掉audio音频流:

    /*** 使用ffmpeg命令行进行抽取视频* @param srcFile 原文件* @param targetFile 目标文件* @return 抽取后的视频文件*/public static  String[] extractVideo(String srcFile, String targetFile){//-an audio notString mixAudioCmd = "ffmpeg -i %s -vcodec copy -an %s";mixAudioCmd = String.format(mixAudioCmd, srcFile, targetFile);return mixAudioCmd.split(" ");//以空格分割为字符串数组}

3、音视频合成

把音频和视频文件合成多媒体文件,关键命令是“-i %s -i %s -t”,分别代表输入音频、视频和文件时长。需要注意的是,如果原视频文件包含有音频,先把单独视频流抽取出来,然后再使用独立音频和视频进行合成:

    /*** 使用ffmpeg命令行进行音视频合成* @param videoFile 视频文件* @param audioFile 音频文件* @param duration 视频时长* @param muxFile 目标文件* @return 合成后的文件*/@SuppressLint("DefaultLocale")public static  String[] mediaMux(String videoFile, String audioFile, int duration, String muxFile){//-t:时长  如果忽略音视频时长,则把"-t %d"去掉String mixAudioCmd = "ffmpeg -i %s -i %s -t %d %s";mixAudioCmd = String.format(mixAudioCmd, videoFile, audioFile, duration, muxFile);return mixAudioCmd.split(" ");//以空格分割为字符串数组}

单独的视频提取出来后,进行音视频合成:

public void handleMessage(Message msg) {super.handleMessage(msg);if(msg.what == 100){String audioFile = PATH + File.separator + "tiger.mp3";//tiger.mp3String muxFile = PATH + File.separator + "media-mux.mp4";try {//使用MediaPlayer获取视频时长MediaPlayer mediaPlayer = new MediaPlayer();mediaPlayer.setDataSource(videoFile);mediaPlayer.prepare();//单位为msint videoDuration = mediaPlayer.getDuration()/1000;Log.i(TAG, "videoDuration=" + videoDuration);mediaPlayer.release();//使用MediaMetadataRetriever获取音频时长MediaMetadataRetriever mediaRetriever = new MediaMetadataRetriever();mediaRetriever.setDataSource(audioFile);//单位为msString duration = mediaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);int audioDuration = (int)(Long.parseLong(duration)/1000);Log.i(TAG, "audioDuration=" + audioDuration);mediaRetriever.release();//如果视频时长比音频长,采用音频时长,否则用视频时长int mDuration = Math.min(audioDuration, videoDuration);//使用纯视频与音频进行合成String[] commandLine = FFmpegUtil.mediaMux(temp, audioFile, mDuration, muxFile);executeFFmpegCmd(commandLine);isMux = false;} catch (Exception e) {e.printStackTrace();}}}

拼接好FFmpeg命令后,调用native方法去执行:

/*** 调用ffmpeg处理音视频* @param handleType handleType*/private void doHandleMedia(int handleType){String[] commandLine = null;switch (handleType){case 0://音视频合成try {//视频文件有音频,先把纯视频文件抽取出来commandLine = FFmpegUtil.extractVideo(videoFile, temp);isMux = true;} catch (Exception e) {e.printStackTrace();}break;case 1://提取音频String extractAudio = PATH + File.separator + "extractAudio.aac";commandLine = FFmpegUtil.extractAudio(srcFile, extractAudio);break;case 2://提取视频String extractVideo = PATH + File.separator + "extractVideo.mp4";commandLine = FFmpegUtil.extractVideo(srcFile, extractVideo);break;default:break;}executeFFmpegCmd(commandLine);}

FFmpeg执行的回调:

/*** 执行ffmpeg命令行* @param commandLine commandLine*/private void executeFFmpegCmd(final String[] commandLine){if(commandLine == null){return;}FFmpegCmd.execute(commandLine, new FFmpegCmd.OnHandleListener() {@Overridepublic void onBegin() {Log.i(TAG, "handle media onBegin...");}@Overridepublic void onEnd(int result) {Log.i(TAG, "handle media onEnd...");if(isMux){mHandler.obtainMessage(100).sendToTarget();}else {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MediaHandleActivity.this, "handle media finish...", Toast.LENGTH_SHORT).show();}});}}});}

好了,使用FFmpeg进行音视频合成与分离介绍完毕。如果各位有什么问题或者建议,欢迎交流。

源码:https://github.com/xufuji456/FFmpegAndroid。如果对您有帮助,麻烦fork和star。

android端采用FFmpeg进行音视频合成与分离相关推荐

  1. android端采用FFmpeg进行视频剪切、转码与添加水印

    前两篇文章介绍过FFmpeg进行音频处理.音视频处理:android端采用FFmpeg进行音频混合与拼接剪切, android端采用FFmpeg进行音视频合成与分离.关于FFmpeg涉及文件导入以及c ...

  2. FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频

    一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...

  3. android端采用FFmpeg进行音频混合与拼接剪切

    接触FFmpeg有一段时间了,它是音视频开发的开源库,几乎其他所有播放器.直播平台都基于FFmpeg进行二次开发.本篇文章来总结下采用FFmpeg进行音频处理:音频混合.音频剪切.音频拼接与音频转码. ...

  4. Android端实现多人音视频聊天应用(一)

    本文转载于资深Android开发者"东风玖哥"的博客. 本系列文章分享了基于Agora SDK 2.1实现多人视频通话的实践经验. 转载已经过原作者许可.原文地址 自从2016年, ...

  5. Android端实现多人音视频聊天应用(二):多人视频通话

    作者:声网用户,资深Android工程师吴东洋 本系列文章分享了基于Agora SDK 2.1实现多人视频通话的实践经验. 在上一篇<Android 多人视频聊天应用的开发(一)一对一聊天> ...

  6. 视频教程-Android WebRTC 实现1V1实时音视频通信-Android

    Android WebRTC 实现1V1实时音视频通信 从2012年开始从事移动互联网方面的开发工作,曾担任去哪儿网开发工程师,搜狗高级开发工程师,拥有多年一线实战开发经验. 擅长语言:Object- ...

  7. android 混音 源码,FFmpegAndroid android 端基于 FFmpeg 实现音频剪切、拼接、转码、混音、编解码;视频剪切、水印、截图、转码、编 @codeKK c开源站...

    android 端基于 FFmpeg 库的使用 添加编译 ffmpeg.shine.mp3lame.x264 源码的参考脚本 目前音视频相关处理: 音频剪切.拼接 音频混音 音频转码 音视频合成 音频 ...

  8. Atitit ffmpeg功能表 多媒体处理类库工具 音频视频 1.1.ffmpeg音视频合成  1.2.Atitit 视频音频分离 提取法 1.3.ffmpeg对视频封装和分离 使用ffmpeg对

    Atitit ffmpeg功能表 多媒体处理类库工具 音频视频 目录 1.1. ffmpeg音视频合成 1 1.2. Atitit 视频音频分离 提取法 1 1.3. ffmpeg对视频封装和分离 1 ...

  9. 使用FFMPEG进行音视频编解码(C++) 0.简介

    FFMPEG介绍 FFMPEG是一个开源的编解码软件,读作"ef ef em peg".官方网址是:http://ffmpeg.org/.FFMPEG几乎支持所有的格式,当然了像一 ...

最新文章

  1. jquery对象PHP转换,jquery对象和DOM对象如何相互转换?
  2. R语言sys方法:sys.info函数获取系统和用户信息、sys.localeConv函数获取当前区域中的数字和货币表示的详细信息、sys.setFileTime函数更改文件的时间
  3. 一本书带你入门商业数据科学
  4. Vmware vSphere 5.0安装和配置
  5. VMware 虚拟化编程(6) — VixDiskLib 虚拟磁盘库详解之二
  6. 默认路由-静态路由-动态路由
  7. C# 方法中的this参数
  8. QT的QNoDraw类的使用
  9. python 多关键字排序_用Python排序字​​典
  10. 微服务~Consul服务注册与发现
  11. 版本控制、协同开发工具比较
  12. 高效的JavaScript
  13. homebrew安装及常用命令
  14. 谷歌浏览器(Chrome浏览器)最新官方下载(含注意事项)
  15. 条形码标签,实现产品追溯的最佳工具
  16. 在sap系统新建财务BTE OBBH OB28替代
  17. zz什么是beacons - 在Web Analytics中的应用(网站分析的灯塔)
  18. Keras构建用于分类任务的Transformer(Vision Transformer/VIT)
  19. Fluent网格划分经验
  20. [关键字]volatile

热门文章

  1. NPOI 打印设置,网格线,页眉页脚字体大小
  2. Error: Error while compiling statement: FAILED: SemanticException Schema of both sides of union shou
  3. 言语理解——片段阅读
  4. 【linux运维笔记】 第一章 Linux发展史与安装
  5. 2022年低压电工考试题模拟考试题库及答案
  6. 【微博SDK调用逻辑】微博SDK的调用逻辑,最好自己还是写一个例子,试一下!!!...
  7. 11月05日解题报告
  8. 互联网快讯:今年《英雄联盟》全明星赛将停办;极米优质投影产品获好评;酷派正式发布新品COOL 20 Pro
  9. 洛奇今天突然与服务器连接中断,《洛奇Mabinogi》官方网站
  10. API接口设计要考虑的几个重要原则和方法总结