android端采用FFmpeg进行音视频合成与分离
上一篇文章谈到音频剪切、混音、拼接与转码,也详细介绍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进行音视频合成与分离相关推荐
- android端采用FFmpeg进行视频剪切、转码与添加水印
前两篇文章介绍过FFmpeg进行音频处理.音视频处理:android端采用FFmpeg进行音频混合与拼接剪切, android端采用FFmpeg进行音视频合成与分离.关于FFmpeg涉及文件导入以及c ...
- FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频
一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...
- android端采用FFmpeg进行音频混合与拼接剪切
接触FFmpeg有一段时间了,它是音视频开发的开源库,几乎其他所有播放器.直播平台都基于FFmpeg进行二次开发.本篇文章来总结下采用FFmpeg进行音频处理:音频混合.音频剪切.音频拼接与音频转码. ...
- Android端实现多人音视频聊天应用(一)
本文转载于资深Android开发者"东风玖哥"的博客. 本系列文章分享了基于Agora SDK 2.1实现多人视频通话的实践经验. 转载已经过原作者许可.原文地址 自从2016年, ...
- Android端实现多人音视频聊天应用(二):多人视频通话
作者:声网用户,资深Android工程师吴东洋 本系列文章分享了基于Agora SDK 2.1实现多人视频通话的实践经验. 在上一篇<Android 多人视频聊天应用的开发(一)一对一聊天> ...
- 视频教程-Android WebRTC 实现1V1实时音视频通信-Android
Android WebRTC 实现1V1实时音视频通信 从2012年开始从事移动互联网方面的开发工作,曾担任去哪儿网开发工程师,搜狗高级开发工程师,拥有多年一线实战开发经验. 擅长语言:Object- ...
- android 混音 源码,FFmpegAndroid android 端基于 FFmpeg 实现音频剪切、拼接、转码、混音、编解码;视频剪切、水印、截图、转码、编 @codeKK c开源站...
android 端基于 FFmpeg 库的使用 添加编译 ffmpeg.shine.mp3lame.x264 源码的参考脚本 目前音视频相关处理: 音频剪切.拼接 音频混音 音频转码 音视频合成 音频 ...
- 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 ...
- 使用FFMPEG进行音视频编解码(C++) 0.简介
FFMPEG介绍 FFMPEG是一个开源的编解码软件,读作"ef ef em peg".官方网址是:http://ffmpeg.org/.FFMPEG几乎支持所有的格式,当然了像一 ...
最新文章
- jquery对象PHP转换,jquery对象和DOM对象如何相互转换?
- R语言sys方法:sys.info函数获取系统和用户信息、sys.localeConv函数获取当前区域中的数字和货币表示的详细信息、sys.setFileTime函数更改文件的时间
- 一本书带你入门商业数据科学
- Vmware vSphere 5.0安装和配置
- VMware 虚拟化编程(6) — VixDiskLib 虚拟磁盘库详解之二
- 默认路由-静态路由-动态路由
- C# 方法中的this参数
- QT的QNoDraw类的使用
- python 多关键字排序_用Python排序字​​典
- 微服务~Consul服务注册与发现
- 版本控制、协同开发工具比较
- 高效的JavaScript
- homebrew安装及常用命令
- 谷歌浏览器(Chrome浏览器)最新官方下载(含注意事项)
- 条形码标签,实现产品追溯的最佳工具
- 在sap系统新建财务BTE OBBH OB28替代
- zz什么是beacons - 在Web Analytics中的应用(网站分析的灯塔)
- Keras构建用于分类任务的Transformer(Vision Transformer/VIT)
- Fluent网格划分经验
- [关键字]volatile
热门文章
- NPOI 打印设置,网格线,页眉页脚字体大小
- Error: Error while compiling statement: FAILED: SemanticException Schema of both sides of union shou
- 言语理解——片段阅读
- 【linux运维笔记】 第一章 Linux发展史与安装
- 2022年低压电工考试题模拟考试题库及答案
- 【微博SDK调用逻辑】微博SDK的调用逻辑,最好自己还是写一个例子,试一下!!!...
- 11月05日解题报告
- 互联网快讯:今年《英雄联盟》全明星赛将停办;极米优质投影产品获好评;酷派正式发布新品COOL 20 Pro
- 洛奇今天突然与服务器连接中断,《洛奇Mabinogi》官方网站
- API接口设计要考虑的几个重要原则和方法总结