使用Java调用linux命令ffmpeg

116 篇文章 0 订阅
96 篇文章 0 订阅

http://lenj.blog.163.com/blog/static/127420388201411112545226/

使用Java调用linux命令ffmpeg  

2014-12-11 14:09:11|  分类: J2EE|举报|字号 订阅

下载LOFTER客户端
//win下获取ffmpeg路径  
String path = ServletActionContext.getServletContext().getRealPath("/WEB-INF/classes/ffmpeg.exe");
// linux路径 
String path="/usr/local/bin/ffmpeg";

String raw2flvCmd = "/usr/local/ffmpeg/bin/ffmpeg -i \"某视频文件下载URL\" -f flv /usr/userfile/ffmpeg/tempfile/1.flv";  
Runtime.getRuntime().exec(new String[]{"sh","-c",raw2flvCmd}); 
package com.nvvideo.util.cmd;  
  
import java.io.BufferedReader;  
import java.io.InputStreamReader;  
import java.util.List;  
  
  
/** 
 * CmdExecuter 
 * <p>Title: 命令执行器</p> 
 * <p>Description: 封装对操作系统命令行发送指令相关操作</p> 
 */  
public class CmdExecuter {  
      
    /** 
     * 执行指令 
     * @param cmd 执行指令 
     * @param getter 指令返回处理接口,若为null则不处理输出 
     */  
    static public void exec( List<String> cmd, IStringGetter getter ){  
        try {  
            ProcessBuilder builder = new ProcessBuilder();    
            builder.command(cmd);  
            builder.redirectErrorStream(true);  
            Process proc = builder.start();  
            BufferedReader stdout = new BufferedReader(  
                    new InputStreamReader(proc.getInputStream()));  
            String line;  
            while ((line = stdout.readLine()) != null) {  
                if( getter != null )  
                    getter.dealString(line);  
            }  
            proc.waitFor();     
            stdout.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

/** 
 * IStringGetter 
 * <p>Title: 字符串接收者接口</p> 
 * <p>Description: </p> 
*/  
public interface IStringGetter {  
    /** 
     * 处理字符串 
     * @param str 
     */  
    public void dealString( String str );  
}

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.nvvideo.util.cmd.CmdExecuter;
import com.nvvideo.util.cmd.IStringGetter;


public class FFMpegUtil implements IStringGetter {

private long runtime = 0;
private String ffmpegUri;// ffmpeg地址
private String originFileUri; // 视频源文件地址

private enum FFMpegUtilStatus {
Empty, CheckingFile, GettingRuntime
};

private FFMpegUtilStatus status = FFMpegUtilStatus.Empty;

/**
 * 构造函数
 * 
 * @param ffmpegUri
 *            ffmpeg的全路径 如e:/ffmpeg/ffmpeg.exe 或 /usr/local/bin/ffmpeg
 * @param originFileUri
 *            所操作视频文件的全路径 如e:/upload/temp/test.wmv
 */
public FFMpegUtil(String ffmpegUri, String originFileUri) {
this.ffmpegUri = ffmpegUri;
this.originFileUri = originFileUri;
}

/**
 * 获取视频时长
 * 
 * @return
 */
public long getRuntime() {
runtime = 0;
status = FFMpegUtilStatus.GettingRuntime;
System.out.println(status);
cmd.clear();
cmd.add(ffmpegUri);
cmd.add("-i");
cmd.add(originFileUri);
CmdExecuter.exec(cmd, this);
return runtime;
}

/**
 * 检测文件是否是支持的格式 将检测视频文件本身,而不是扩展名
 * 
 * @return
 */
public boolean isSupported() {
isSupported = false;
status = FFMpegUtilStatus.CheckingFile;
cmd.clear();
cmd.add(ffmpegUri);
cmd.add("-i");
cmd.add(originFileUri);
cmd.add("Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s");
CmdExecuter.exec(cmd, this);
return isSupported;
}

private boolean isSupported;

/**
 * 生成视频截图
 * 
 * @param imageSavePath
 *            截图文件保存全路径
 * @param screenSize
 *            截图大小 如640x480
 */
public void makeScreenCut(String imageSavePath, String screenSize) {
cmd.clear();
cmd.add(ffmpegUri);
cmd.add("-i");
cmd.add(originFileUri);
cmd.add("-y");
cmd.add("-f");
cmd.add("image2");
cmd.add("-ss");
cmd.add("2");
cmd.add("-t");
cmd.add("0.001");
cmd.add("-s");
cmd.add(screenSize);
cmd.add(imageSavePath);
CmdExecuter.exec(cmd, this);
}

private List<String> cmd = new ArrayList<String>();


public void dealString(String str) {
System.out.println("==dealString==="+str);

switch (status) {
case Empty:
break;
case CheckingFile: {
if (-1 != str.indexOf("Metadata:"))
this.isSupported = true;
break;
}
case GettingRuntime: {
String strs="";
if(str.contains("Duration")){
System.out.println(str.substring(str.indexOf(":")+1,str.indexOf(",")));
strs=str.substring(str.indexOf(":")+1,str.indexOf(","));
if(strs!=null){
runtime = TimeUtils.Test(strs);
}
}
// Matcher m = Pattern.compile("Duration").matcher(str);
// System.out.println("====msgm======="+m);
// while (m.find()) {
// String msg = m.group();
// msg = msg.replace("Duration: ","");
// System.out.println("====msg======="+msg);
//runtime = TimeUtils.Test(strs);
// }
break;
}
}// switch
}
}

public class TimeUtils {
public static long Test(String str){
long t=Integer.parseInt(str.substring(1,3))*60*60+Integer.parseInt(str.substring(4,6))*60+Integer.parseInt(str.substring(7,9));
System.out.println(t);
return t;
}
}

阅读(1558) |  评论(1)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FFmpeg是一个开源的跨平台的音视频处理框架,而FFmpeg Java API则是基于Java语言封装了FFmpeg功能的一个库。 使用FFmpeg Java API,我们可以在Java程序中方便地进行音视频的解码、编码、转码、剪切、合并等操作。通过调用FFmpeg的各种命令和参数,可以实现对音视频文件的各种处理需求。 FFmpeg Java API的主要特点包括: 1. 跨平台:由于基于Java语言开发,FFmpeg Java API可以在各种操作系统上使用,包括Windows、Linux、Mac等。 2. 功能强大:FFmpeg提供了丰富的音视频处理功能,FFmpeg Java API则封装了这些功能,使得在Java程序中可以方便地调用。 3. 简单易用:FFmpeg Java API提供了简洁的接口和方法,使得开发者可以快速上手,并快速实现各种音视频处理需求。 4. 高效性能:FFmpeg本身就是一个高性能的音视频处理框架,而FFmpeg Java API则是通过JNI技术与Java进行交互,保证了高效的执行速度和内存管理。 除了基本的音视频编解码功能外,FFmpeg Java API还支持基于滤镜的视频处理、音频处理、字幕添加等功能,使得开发者可以实现更加丰富的音视频处理效果。 总而言之,FFmpeg Java API是一个功能强大、跨平台、简单易用的音视频处理库,可以帮助开发者在Java程序中实现各种音视频处理需求。无论是简单的音视频格式转换,还是复杂的剪辑合成,FFmpeg Java API都能提供便捷的解决方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值