原文地址:
http://www.ll19.com/log/tag/FFmpeg/#
java调用FFmpeg及mencoder转换视频为FLV并截图,需要FFmpeg及mencoder支持请自行下载,以下为相关程序:
Conver.java
package com.ll19.flv;
public class Conver {
public void run() {
try {
// 转换并截图
String filePath = "D:\\video\\old\\test.avi";
ConverVideo cv = new ConverVideo(filePath);
cv.beginConver();
// 仅截图
// ProcessFlvImg pfi = new ProcessFlvImg();
// pfi.processImg("D:\\video\\old\\test.avi");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
Conver c = new Conver();
c.run();
}
}
ConverVideo.java
package com.ll19.flv;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class ConverVideo {
private Date dt;
private long begintime;
private String PATH;
private String filerealname; // 文件名 不包括扩展名
private String filename; // 包括扩展名
private String videofolder = "D:\\video\\other\\"; // 别的格式视频的目录
private String flvfolder = "D:\\video\\flv\\"; // flv视频的目录
private String ffmpegpath = "D:\\video\\FFmpeg\\bin\\ffmpeg.exe"; // ffmpeg.exe的目录
private String mencoderpath = "D:\\video\\mencoder\\"; // mencoder的目录
private String videoRealPath = "D:\\video\\flv\\"; // 截图的视频目录;
private String imageRealPath = "D:\\video\\img\\"; // 截图的存放目录
public ConverVideo() {
}
public ConverVideo(String path) {
PATH = path;
}
public String getPATH() {
return PATH;
}
public void setPATH(String path) {
PATH = path;
}
public boolean beginConver() {
File fi = new File(PATH);
filename = fi.getName();
filerealname = filename.substring(0, filename.lastIndexOf("."))
.toLowerCase();
System.out.println("----接收到文件(" + PATH
+ ")需要转换-------------------------- ");
if (!checkfile(PATH)) {
System.out.println(PATH + "文件不存在" + " ");
return false;
}
dt = new Date();
begintime = dt.getTime();
System.out
.println("----开始转文件(" + PATH + ")-------------------------- ");
if (process()) {
Date dt2 = new Date();
System.out.println("转换成功 ");
long endtime = dt2.getTime();
long timecha = (endtime - begintime);
String totaltime = sumTime(timecha);
System.out.println("共用了:" + totaltime + " ");
if (processImg()) {
System.out.println("截图成功了 ");
} else {
System.out.println("截图不成功了 ");
}
PATH = null;
return true;
} else {
PATH = null;
return false;
}
}
public boolean processImg() {
List commend = new java.util.ArrayList();
commend.add(ffmpegpath);
commend.add("-i");
commend.add(videoRealPath + filerealname + ".flv");
commend.add("-y");
commend.add("-f");
commend.add("image2");
commend.add("-ss");
commend.add("38");
commend.add("-t");
commend.add("0.001");
commend.add("-s");
commend.add("320x240");
commend.add(imageRealPath + filerealname + ".jpg");
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.start();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private boolean process() {
int type = checkContentType();
boolean status = false;
if (type == 0) {
// status = processFLV(PATH);// 直接将文件转为flv文件
status = processFLV(PATH);
} else if (type == 1) {
String avifilepath = processAVI(type);
if (avifilepath == null)
return false;
// avi文件没有得到
else {
System.out.println("kaishizhuang");
status = processFLV(avifilepath);// 将avi转为flv
}
}
return status;
}
private int checkContentType() {
String type = PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length())
.toLowerCase();
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
if (type.equals("avi")) {
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("mov")) {
return 0;
} else if (type.equals("mp4")) {
return 0;
} else if (type.equals("asf")) {
return 0;
} else if (type.equals("asx")) {
return 0;
} else if (type.equals("flv")) {
return 0;
}
// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
// 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
else if (type.equals("wmv9")) {
return 1;
} else if (type.equals("rm")) {
return 1;
} else if (type.equals("rmvb")) {
return 1;
}
return 9;
}
private boolean checkfile(String path) {
File file = new File(path);
if (!file.isFile()) {
return false;
} else {
return true;
}
}
// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
private String processAVI(int type) {
List commend = new java.util.ArrayList();
commend.add(mencoderpath);
commend.add(PATH);
commend.add("-oac");
commend.add("mp3lame");
commend.add("-lameopts");
commend.add("preset=64");
commend.add("-ovc");
commend.add("xvid");
commend.add("-xvidencopts");
commend.add("bitrate=600");
commend.add("-of");
commend.add("avi");
commend.add("-o");
commend.add(videofolder + filerealname + ".avi");
// 命令类型:mencoder 1.rmvb -oac mp3lame -lameopts preset=64 -ovc xvid
// -xvidencopts bitrate=600 -of avi -o rmvb.avi
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
Process p = builder.start();
doWaitFor(p);
return videofolder + filerealname + ".avi";
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
private boolean processFLV(String oldfilepath) {
if (!checkfile(PATH)) {
System.out.println(oldfilepath + " is not file");
return false;
}
List commend = new java.util.ArrayList();
commend.add(ffmpegpath);
commend.add("-i");
commend.add(oldfilepath);
commend.add("-ab");
commend.add("64");
commend.add("-acodec");
commend.add("mp3");
commend.add("-ac");
commend.add("2");
commend.add("-ar");
commend.add("22050");
commend.add("-b");
commend.add("230");
commend.add("-r");
commend.add("24");
commend.add("-y");
commend.add(flvfolder + filerealname + ".flv");
try {
ProcessBuilder builder = new ProcessBuilder();
String cmd = commend.toString();
builder.command(commend);
Process p = builder.start();
doWaitFor(p);
p.destroy();
deleteFile(oldfilepath);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public int doWaitFor(Process p) {
InputStream in = null;
InputStream err = null;
int exitValue = -1; // returned to caller when p is finished
try {
System.out.println("comeing");
in = p.getInputStream();
err = p.getErrorStream();
boolean finished = false; // Set to true when p is finished
while (!finished) {
try {
while (in.available() > 0) {
Character c = new Character((char) in.read());
System.out.print(c);
}
while (err.available() > 0) {
Character c = new Character((char) err.read());
System.out.print(c);
}
exitValue = p.exitValue();
finished = true;
} catch (IllegalThreadStateException e) {
Thread.currentThread().sleep(500);
}
}
} catch (Exception e) {
System.err.println("doWaitFor();: unexpected exception - "
+ e.getMessage());
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
if (err != null) {
try {
err.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
return exitValue;
}
public void deleteFile(String filepath) {
File file = new File(filepath);
if (PATH.equals(filepath)) {
if (file.delete()) {
System.out.println("文件" + filepath + "已删除");
}
} else {
if (file.delete()) {
System.out.println("文件" + filepath + "已删除 ");
}
File filedelete2 = new File(PATH);
if (filedelete2.delete()) {
System.out.println("文件" + PATH + "已删除");
}
}
}
public String sumTime(long ms) {
int ss = 1000;
long mi = ss * 60;
long hh = mi * 60;
long dd = hh * 24;
long day = ms / dd;
long hour = (ms - day * dd) / hh;
long minute = (ms - day * dd - hour * hh) / mi;
long second = (ms - day * dd - hour * hh - minute * mi) / ss;
long milliSecond = ms - day * dd - hour * hh - minute * mi - second
* ss;
String strDay = day < 10 ? "0" + day + "天" : "" + day + "天";
String strHour = hour < 10 ? "0" + hour + "小时" : "" + hour + "小时";
String strMinute = minute < 10 ? "0" + minute + "分" : "" + minute + "分";
String strSecond = second < 10 ? "0" + second + "秒" : "" + second + "秒";
String strMilliSecond = milliSecond < 10 ? "0" + milliSecond : ""
+ milliSecond;
strMilliSecond = milliSecond < 100 ? "0" + strMilliSecond + "毫秒" : ""
+ strMilliSecond + " 毫秒";
return strDay + " " + strHour + ":" + strMinute + ":" + strSecond + " "
+ strMilliSecond;
}
}
[b]ProcessFlvImg.java[/b]
package com.ll19.flv;
import java.io.File;
import java.util.List;
public class ProcessFlvImg {
public String ffmpegpath = "D:\\video\\FFmpeg\\bin\\ffmpeg.exe"; // ffmpeg.exe的目录
public boolean processImg(String path) {
File fi = new File(path);
List commend = new java.util.ArrayList();
commend.add(ffmpegpath);
commend.add("-i");
commend.add(path);
commend.add("-y");
commend.add("-f");
commend.add("image2");
commend.add("-ss");
commend.add("38");
commend.add("-t");
commend.add("0.001");
commend.add("-s");
commend.add("320x240");
commend.add(fi.getPath() + ".jpg");
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.start();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
分享到:
相关推荐
在本文中,我们将深入探讨如何使用Java程序调用FFmpeg执行视频文件格式转换,特别是将非FFmpeg原生支持的格式转换为FLV格式。FFmpeg是一个强大的多媒体处理工具,支持多种视频、音频格式的编码、解码和转换。在这个...
在Java中使用FFmpeg,通常会借助于一些第三方库,如JNA(Java Native Access)或jni4net,这些库允许Java代码直接调用FFmpeg的C/C++接口。例如,可以创建一个Java方法,传递FFmpeg的命令行参数,然后通过`Runtime....
要将视频转换为FLV格式,使用FFmpeg的基本命令格式如下: ```bash ffmpeg -i 输入视频文件 -c:v libx264 -preset slow -crf 22 -c:a aac -b:a 128k 输出的FLV文件 ``` 这里,`-i` 参数指定输入视频文件,`-c:v ...
在视频转换过程中,需要首先将视频文件上传到服务器,然后使用FFMPEG和MENCODER将其转换成FLV格式,最后将其嵌入PHP网页中。这个过程可以自动完成,无需人工干预。 PHP网页是指使用PHP语言编写的网页程序。PHP是一...
Java使用ffmpeg和mencoder实现视频转码是指使用Java语言调用ffmpeg和mencoder这两个流行的开源多媒体处理工具来实现视频转码的过程。视频转码是将视频文件从一种格式转换为另一种格式的过程,例如从AVI转换为MP4或从...
详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:WindowsSystem32下面 这几天在写一个视频管理系统,...
例如,使用FFmpeg进行视频转码的基本步骤如下: 1. **构建命令**:根据需要设置输入文件、输出文件、编码参数等,构建FFmpeg或MEncoder的命令行字符串。 2. **执行命令**:使用`Runtime.getRuntime().exec(command)...
在视频转换场景中,FFmpeg可以轻松地将多种视频格式转换为FLV,以适应网络播放需求。使用FFmpeg进行转换的基本命令如下: ```bash ffmpeg -i input_video.mp4 -c:v libx264 -preset slow -crf 22 -c:a aac -b:a 128...
在本DEMO中,mencoder被用来将视频转换为FLV格式,这是一种广泛应用于网络流媒体的格式,因其体积小、播放流畅而受到欢迎。转换过程通常包括以下步骤: 1. 首先,确定源视频文件的位置和输出目标。 2. 使用mencoder...
1. **音视频转换**:使用`-i`参数指定输入文件,`-c:v`和`-c:a`分别指定视频和音频编码器,`output.mp4`为输出文件名。例如: ``` ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4 ``` 2. **调整视频...
压缩包内的`java调用视频转换工具ffmpeg.doc`应该包含了如何在Java代码中使用FFmpeg的具体示例。通常需要编写一个Java工具类,封装FFmpeg的命令行调用,包括设置输入输出路径、编码参数等。 4. 使用说明文档:`java...
使用FFmpeg进行视频格式转换非常简单,基本命令结构如下: ``` ffmpeg -i 输入文件 -c:v 输出编码器 -c:a 输出音频编码器 输出文件 ``` 例如,将一个MP4文件转换为WebM格式: ``` ffmpeg -i input.mp4 -c:v libvpx-...
其优势在于速度和效率,对于大批量的视频转换任务,MEncoder往往能提供更快的处理速度。 以下是FFmpeg和MEncoder的一些关键知识点: 1. **基本命令行用法**:两个工具都通过命令行接口操作,用户需要指定输入文件...
FFmpeg和mencoder是两个广泛使用的音视频转码工具,它们在数字媒体处理领域具有重要地位。FFmpeg是一个全面的开源项目,包含了多种用于处理音视频的库和工具,而mencoder则是MPlayer播放器的一部分,专为视频转码...
要将RM或RMVB转换为FLV,首先你需要下载并安装FFmpeg和MEncoder。在这个压缩包中,"ffmpeg.zip"包含FFmpeg的源代码或预编译版本,而"MPlayer-mingw32-1.0rc2.zip"可能是MPlayer的Windows版本,其中也包含了MEncoder...
Java调用FFmpeg实现视频转换涉及到Java编程语言和FFmpeg多媒体处理工具的使用。FFmpeg是一个非常强大的命令行工具,支持几乎所有的视频文件格式转换。在Java中调用FFmpeg,通常使用Runtime或者ProcessBuilder类来...
- `processFLV(String path)`:使用FFmpeg将文件转换为flv格式。 #### 三、注意事项 - **异常处理:** - 在实际应用中,需要考虑文件不存在、转换失败等异常情况,并添加相应的异常处理逻辑。 - **性能优化:**...
例如,如果你需要将一个MP4视频转换为WebM格式,你可以使用以下命令: ``` ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 1M -c:a libvorbis output.webm ``` 在这个命令中,`-i`指定输入文件,`-c:v libvpx-vp...
对于将视频文件转换为`.flv`,使用ffmpeg的命令如下: ```bash ffmpeg -i input_video_file -c:v flv -c:a libmp3lame -b:a 64k output.flv ``` 这里的`-i input_video_file`是输入文件,`-c:v flv`指定视频编码器...
在Java中使用FFmpeg,通常需要借助于一个Java库,如JAVE(Java Audio Video Encoder),它封装了FFmpeg的命令行操作,提供了一个友好的Java API。首先,你需要将FFmpeg添加到你的系统路径中,然后通过JAVE调用相应的...