//ffmpeg获取音频属性信息、转码amr、按照时长进行切片
package com.java.manage.util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import com.java.manage.servlet.broadcast.AudioInfo;
/**
* ffmpeg工具类
* @author Administrator
*
*/
public class FFMpegUtil {
public static final Logger logger = Logger.getLogger(FFMpegUtil.class);
public static String FFMPEGURI = "ffmpeg";
public static enum AudioType {
amr, mp3, wav,unknown
};
public static AudioInfo getAudioInfo(String originFileUri) {
return getAudioInfo(FFMPEGURI, originFileUri);
}
/**
* 获取音频信息
* @param ffmpegUri ffmpeg的全路径 如e:/ffmpeg/ffmpeg.exe 或 /usr/local/bin/ffmpeg
* @param originFileUri 所操作视频文件的全路径 如e:/upload/temp/test.wmv
* @return
*/
public static AudioInfo getAudioInfo(String ffmpegUri,String originFileUri) {
try {
List<String> cmd = new ArrayList<String>();
cmd.add(ffmpegUri);
cmd.add("-i");
cmd.add(originFileUri);
List<String> strs= exec(cmd);
AudioInfo ai = dealString(strs);
ai.setPath(originFileUri);
return ai;
} catch (Exception e) {
logger.error("获取音频信息错误:",e);
}
return null;
}
/**
* 获取音频编码
* @param ai
* @return
*/
public static AudioType getAudioType(AudioInfo ai){
if(ai.getAudio().toLowerCase().contains("amr")){
return FFMpegUtil.AudioType.amr;
}else if(ai.getAudio().toLowerCase().contains("mp3")){
return FFMpegUtil.AudioType.mp3;
}else if(ai.getAudio().toLowerCase().contains("wav")){
return FFMpegUtil.AudioType.wav;
}
return FFMpegUtil.AudioType.unknown;
}
/**
* 执行指令
* @param cmd 执行指令
* @param getter 指令返回处理接口,若为null则不处理输出
*/
static public List<String> exec( List<String> cmd){
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(cmd);
builder.redirectErrorStream(true);
Process proc = builder.start();
BufferedReader stdout = new BufferedReader(
new InputStreamReader(proc.getInputStream()));
List<String> strs = new ArrayList<String>();
String line;
while ((line = stdout.readLine()) != null) {
strs.add(line);
}
proc.waitFor();
stdout.close();
return strs;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
static String DURATION = "Duration";
static String BITRATE = "bitrate";
static String AUDIO = "Audio";
public static AudioInfo dealString(List<String> strs) {
System.out.println("音频信息:"+strs);
AudioInfo ai = new AudioInfo();
for(String str : strs){
if(str.contains(DURATION)){
String bak = str.substring(str.indexOf(DURATION)+DURATION.length());
String temp=bak.substring(bak.indexOf(":")+1,bak.indexOf(","));
if(temp!=null){
ai.setDuration(getLongTime(temp));
}
}
if(str.contains(BITRATE)){
String bak = str.substring(str.indexOf(BITRATE)+BITRATE.length());
String temp=bak.substring(bak.indexOf(":")+1,bak.lastIndexOf(" "));
if(temp!=null){
ai.setBitrate(temp.trim());
}
}
if(str.contains(AUDIO)){
String bak = str.substring(str.indexOf(AUDIO)+AUDIO.length());
String temp=bak.substring(bak.indexOf(":")+1,bak.indexOf(","));
if(temp!=null){
ai.setAudio(temp.trim());
}
}
}
return ai;
}
public static int getLongTime(String str){
int t=Integer.parseInt(str.substring(1,3))*60*60+Integer.parseInt(str.substring(4,6))*60+Integer.parseInt(str.substring(7,9));
return t;
}
/**
* 将秒转成小时分秒
* @param time
* @return
*/
public static String getStringTime(int time){
//小时
int h = time / 3600 ;
int m = (time % 3600)/60 ;
int s = (time % 3600) % 60 ;
return String.format("%02d:%02d:%02d", h,m,s);
}
/**
* 音频转码
* @param inputfile
* @param outputfile
*/
public static void transcode(String inputfile,String outputfile){
try {
List<String> cmd = new ArrayList<String>();
cmd.add(FFMPEGURI);
cmd.add("-i");
cmd.add(inputfile);
cmd.add("-ac 1");
cmd.add("-ar 8000");
cmd.add("-ab 128");
cmd.add(outputfile);
exec(cmd);
} catch (Exception e) {
logger.error("音频转码错误:",e);
}
}
/**
* 按照时长进行切片
* @param inputfile
* @param files
* @param duration
*/
public static void split(String inputfile,List<String> files,int duration){
int start = 0;
while(start <= duration){
String temp = FileUtil.getTempFile();
files.add(temp);
split(inputfile,temp, start, duration);
start =+ duration;
}
}
public static void split(String inputfile,String outputfile,int start,int duration){
try {
List<String> cmd = new ArrayList<String>();
cmd.add(FFMPEGURI);
cmd.add("-ss");
cmd.add(getStringTime(start));
cmd.add("-i");
cmd.add(inputfile);
cmd.add("-c copy");
cmd.add("-t");
cmd.add(String.valueOf(duration));
cmd.add(outputfile);
exec(cmd);
} catch (Exception e) {
logger.error("音频切片错误:",e);
}
}
}