1.2.2 视频处理技术方案
如何通过程序进行视频处理?
ffmpeg是一个可行的视频处理程序,可以通过Java调用ffmpeg.exe完成视频处理。
在java中可以使用Runtime类和Process Builder类两种方式来执行外部程序,工作中至少掌握一种。
本项目使用Process Builder的方式来调用ffmpeg完成视频处理。
关于Process Builder的测试如下:
@Test
public void testProcessBuilder() throws IOException {
//创建ProcessBuilder对象
ProcessBuilder processBuilder =new ProcessBuilder();
//设置执行的第三方程序(命令)
processBuilder.command("ping","127.0.0.1");
//processBuilder.command("ipconfig");
// processBuilder.command("java","-jar","f:/xc-service-manage-course.jar");
//将标准输入流和错误输入流合并,通过标准输入流读取信息就可以拿到第三方程序输出的错误信息、正常信息
processBuilder.redirectErrorStream(true);
//启动一个进程
Process process = processBuilder.start();
//由于前边将错误和正常信息合并在输入流,只读取输入流
InputStream inputStream = process.getInputStream();
//将字节流转成字符流
InputStreamReader reader = new InputStreamReader(inputStream,"gbk");
//字符缓冲区
char[] chars = new char[1024];
int len = -1;
while((len = reader.read(chars))!=-1){
String string = new String(chars,0,len);
System.out.println(string);
}
inputStream.close();
reader.close();
}
@Test
public void testFFmpeg() {
ProcessBuilder processBuilder = new ProcessBuilder();
//定义命令内容
List<String> command = new ArrayList<>();
command.add("E:\\java_soft\\ffmpeg-20180227-fa0c9d6-win64-static\\bin\\ffmpeg.exe");
command.add("‐i");
command.add("E:\\java_www\\ffmpeg_test\\lucene.avi");
command.add("‐y");//覆盖输出文件
command.add("‐c:v");
command.add("libx264");
//测试使用工具类将avi转成mp4
command.add("‐s");
command.add("1280x720");
command.add("‐pix_fmt");
command.add("yuv420p");
command.add("‐b:a");
command.add("63k");
command.add("‐b:v");
command.add("753k");
command.add("‐r");
command.add("18");
command.add("E:\\java_www\\ffmpeg_test\\1.mp4");
processBuilder.command(command);
//将标准输入流和错误输入流合并,通过标准输入流读取信息
processBuilder.redirectErrorStream(true);
try {
//启动进程
Process start = processBuilder.start();
//获取输入流
InputStream inputStream = start.getInputStream();
//转成字符输入流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "gbk");
int len = -1;
char[] c = new char[1024];
StringBuffer outputString = new StringBuffer();
//读取进程输入流中的内容
while ((len = inputStreamReader.read(c)) != -1) {
String s = new String(c, 0, len);
outputString.append(s);
System.out.print(s);
}
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
这种方式太麻烦,所以改为以下方式
上边的代码已经封装成工具类,参见:
上边的工具类中:
Mp4VideoUtil.java完成avi转mp4
HlsVideoUtil.java完成mp4转hls
分别测试每个工具类的使用方法。
@Test
public void testProcessMp4() {
//String ffmpeg_path, String video_path, String mp4_name, String mp4folder_path
//ffmpeg的路径
String ffmpeg_path = "E:\\java_soft\\ffmpeg-20180227-fa0c9d6-win64-static\\bin\\ffmpeg.exe";
//video_path视频地址
String video_path = "E:\\java_www\\ffmpeg_test\\lucene.avi";
//mp4_name mp4文件名称
String mp4_name = "1.mp4";
//mp4folder_path mp4文件目录路径
String mp4folder_path = "E:/java_www/ffmpeg_test/";
Mp4VideoUtil mp4VideoUtil = new Mp4VideoUtil(ffmpeg_path, video_path, mp4_name, mp4folder_path);
//开始编码,如果成功返回success,否则返回输出的日志
String result = mp4VideoUtil.generateMp4();
System.out.println(result);
}