ffmpeg获取音频属性信息、转码、切片

//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 cmd = new ArrayList();
cmd.add(ffmpegUri);
cmd.add("-i");
cmd.add(originFileUri);
List 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 exec( List 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 strs = new ArrayList();
            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 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 cmd = new ArrayList();
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 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 cmd = new ArrayList();
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);
}
}

}

你可能感兴趣的:(ffmpeg)