ffmpeg的使用,通过Java来进行对视频的转码和截图

1.配置ffmpeg的环境变量

2.代码如下

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;


/**
* @Author LinXin
* 1.设置视频输出目录
* 2.获取上传视频的路径以及文件名
* 3.截取后缀名判断格式
* 4.ffmpeg不支持的格式先使用mencoder转成AVI格式 丢弃
* 5.AVI再转成flv格式,同时删除缓存文件 丢弃
*/
public class Video {
//视频输出目录
private static final String OutSrc = "C:/Users/LinXin/Desktop/测试视频/flv/";
//截图输出目录
private static final String imageOutSrc = "C:/Users/LinXin/Desktop/测试视频/Screen/";
//视频类型
private static final String OutType = ".flv";
//图片类型
private static final String ImagesType = ".jpg";
//转码完视频路径
private static String videoOutSrc = null;


public static void main(String[] args) {
String fileName = "C:/Users/LinXin/Desktop/测试视频/video/1.mp4";
String type = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
File orginFile = new File(fileName);

long start = System.currentTimeMillis();

if (!orginFile.exists()) {
System.out.println("文件不存在");
} else {
int i = checkType(type);
if (i == 0) {
String OutName = fileName.substring(fileName.lastIndexOf("/") +1, fileName.lastIndexOf(".")) + OutType;
File file = new File(OutSrc + OutName);
if (file.exists()) {
System.out.println("文件已存在");
} else {
String command = "cmd /c ffmpeg -i " + fileName + " -c:v copy -c:a copy " + OutSrc + OutName;
if (procedure(command)) {
File file1 = new File(fileName);
// file1.delete();
System.out.println("Success");
videoOutSrc = OutSrc+OutName;
String fileNameWithNoneType = fileName.substring(fileName.lastIndexOf("/") +1, fileName.lastIndexOf("."));
ScreenShot(videoOutSrc,fileNameWithNoneType);
} else {
System.out.println("Failure");
}
}
} else {
System.out.println("文件类型不支持");
}
}

long end = System.currentTimeMillis();

System.out.println("");
System.out.println("耗时:"+(end-start)/1000);

}

//视频转码,图片截取
public static boolean procedure(String command) {
boolean flag = false;
try {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec(command);
//一个线程去获取正常信息
new Thread(new Runnable() {
BufferedReader infoReader = new BufferedReader(new InputStreamReader(p.getInputStream(), "GBK"));
String line1 = null;

@Override
public void run() {
try {
while ((line1 = infoReader.readLine()) != null) {
System.out.println(line1);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();

//一个线程去获取错误信息
new Thread(new Runnable() {
BufferedReader errorReader = new BufferedReader(new InputStreamReader(p.getErrorStream(), "GBK"));
String line2 = null;

@Override
public void run() {
try {
while ((line2 = errorReader.readLine()) != null) {
System.out.println(line2);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();

int exitValue = p.waitFor();
if (exitValue == 0) {
flag = true;
}
p.destroy();
System.out.println("Exited with error code " + exitValue);
} catch (Exception e) {
System.out.println(e.getMessage());
flag = false;
}
return flag;
}

//ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv,mkv等)
private static int checkType(String type) {
if (type.equals("asx")) {
return 0;
} else if (type.equals("asf")) {
return 0;
} else if (type.equals("mpg")) {
return 0;
} else if (type.equals("wmv")) {
return 0;
} else if (type.equals("3gp")) {
return 0;
} else if (type.equals("mp4")) {
return 0;
} else if (type.equals("mov")) {
return 0;
} else if (type.equals("avi")) {
return 0;
} else if (type.equals("flv")) {
return 0;
} else if (type.equals("mkv")) {
return 0;
}
return 1;
}


//视频截图
public static boolean ScreenShot(String videoPath,String imagesPath){
boolean flag = false;
String command = "ffmpeg -ss 00:00:40 -t 0.001 -i "+videoPath+" -y -f image2 -q:v 2 -s 1920x1080 "+imageOutSrc+imagesPath+ImagesType;
if(procedure(command)){
System.out.println("ScreentShot Success");
}
return flag;
}
}

您可能还会对下面的文章感兴趣: