You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
4.1 KiB
109 lines
4.1 KiB
package com.frank.ffmpeg.util;
|
|
|
|
import android.annotation.SuppressLint;
|
|
|
|
/**
|
|
* ffmpeg工具:拼接命令行处理音频
|
|
* Created by frank on 2018/1/23.
|
|
*/
|
|
|
|
public class FFmpegUtil {
|
|
|
|
/**
|
|
* 使用ffmpeg命令行进行音频转码
|
|
* @param srcFile 源文件
|
|
* @param targetFile 目标文件(后缀指定转码格式)
|
|
* @return 转码后的文件
|
|
*/
|
|
public static String[] transformAudio(String srcFile, String targetFile){
|
|
String transformAudioCmd = "ffmpeg -i %s %s";
|
|
transformAudioCmd = String.format(transformAudioCmd, srcFile, targetFile);
|
|
return transformAudioCmd.split(" ");//以空格分割为字符串数组
|
|
}
|
|
|
|
/**
|
|
* 使用ffmpeg命令行进行音频剪切
|
|
* @param srcFile 源文件
|
|
* @param startTime 剪切的开始时间(单位为秒)
|
|
* @param duration 剪切时长(单位为秒)
|
|
* @param targetFile 目标文件
|
|
* @return 剪切后的文件
|
|
*/
|
|
@SuppressLint("DefaultLocale")
|
|
public static String[] cutAudio(String srcFile, int startTime, int duration, String targetFile){
|
|
String cutAudioCmd = "ffmpeg -i %s -ss %d -t %d %s";
|
|
cutAudioCmd = String.format(cutAudioCmd, srcFile, startTime, duration, targetFile);
|
|
return cutAudioCmd.split(" ");//以空格分割为字符串数组
|
|
}
|
|
|
|
/**
|
|
* 使用ffmpeg命令行进行音频合并
|
|
* @param srcFile 源文件
|
|
* @param appendFile 待追加的文件
|
|
* @param targetFile 目标文件
|
|
* @return 合并后的文件
|
|
*/
|
|
public static String[] concatAudio(String srcFile, String appendFile, String targetFile){
|
|
String concatAudioCmd = "ffmpeg -i concat:%s|%s -acodec copy %s";
|
|
concatAudioCmd = String.format(concatAudioCmd, srcFile, appendFile, targetFile);
|
|
return concatAudioCmd.split(" ");//以空格分割为字符串数组
|
|
}
|
|
|
|
/**
|
|
* 使用ffmpeg命令行进行音频混合
|
|
* @param srcFile 源文件
|
|
* @param mixFile 待混合文件
|
|
* @param targetFile 目标文件
|
|
* @return 混合后的文件
|
|
*/
|
|
public static String[] mixAudio(String srcFile, String mixFile, String targetFile){
|
|
String mixAudioCmd = "ffmpeg -i %s -i %s -filter_complex amix=inputs=2:duration=first -strict -2 %s";
|
|
mixAudioCmd = String.format(mixAudioCmd, srcFile, mixFile, targetFile);
|
|
return mixAudioCmd.split(" ");//以空格分割为字符串数组
|
|
}
|
|
//混音公式:value = sample1 + sample2 - (sample1 * sample2 / (pow(2, 16-1) - 1))
|
|
|
|
|
|
/**
|
|
* 使用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 -acodec copy %s";
|
|
mixAudioCmd = String.format(mixAudioCmd, videoFile, audioFile, duration, muxFile);
|
|
return mixAudioCmd.split(" ");//以空格分割为字符串数组
|
|
}
|
|
|
|
/**
|
|
* 使用ffmpeg命令行进行抽取音频
|
|
* @param srcFile 原文件
|
|
* @param targetFile 目标文件
|
|
* @return 抽取后的音频文件
|
|
*/
|
|
public static String[] extractAudio(String srcFile, String targetFile){
|
|
//-vn:video not
|
|
String mixAudioCmd = "ffmpeg -i %s -acodec copy -vn %s";
|
|
mixAudioCmd = String.format(mixAudioCmd, srcFile, targetFile);
|
|
return mixAudioCmd.split(" ");//以空格分割为字符串数组
|
|
}
|
|
|
|
/**
|
|
* 使用ffmpeg命令行进行抽取视频
|
|
* @param srcFile 原文件
|
|
* @param targetFile 目标文件
|
|
* @return 抽取后的视频文件
|
|
*/
|
|
public static String[] extractVideo(String srcFile, String targetFile){
|
|
//-an audio not
|
|
String mixAudioCmd = "ffmpeg -i %s -vcodec copy -an %s";
|
|
mixAudioCmd = String.format(mixAudioCmd, srcFile, targetFile);
|
|
return mixAudioCmd.split(" ");//以空格分割为字符串数组
|
|
}
|
|
|
|
}
|
|
|