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<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);
}
}

}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值