通过java代码,调用底层工具,实现视频格式转换
原理是这样的:
ffmpeg可以转换大多数视频文件,如:avi|wmv|mkv|asx|swf|asf|vob|mpg|mp4|mov|flv等
但有些视频格式,ffmpeg无法转,比如:rm,rmvb等
所以遇到ffmpeg不能转的视频格式时,需要调用另一个工具mencoder,利用mencoder将那些文件转成ffmpeg能够转换的格式。基本通过这2个工具可以转换大多数视频文件
必备组件有
- ffmpeg.exe
- mencoder.exe
- pthreadGC2.dll
pthreadGC2.dll需要放到system32目录下
全部文件下载地址
http://115.com/file/anrac8ke
下载下来的压缩包除了有上述组件外,还有5个文件夹
- ConvertVideo
- img
- input
- system
- output
具体解释
- ConvertVideo是工程文件,在myeclipse9.0下编写完成,可直接导入
- img文件夹是装生成的视频文件缩略图的
- input文件夹里面放你需要转的视频源文件
- system文件是一个中转站,对于ffmpeg不能转的文件,mencoder会将其转成ffmpeg所认识的avi文件,并放置在system文件夹中。当ffmpeg将system文件夹中的avi文件转成flv后,system文件夹自动清空
- output文件夹则是存放转好了的flv视频文件
这里有一片CSDN的文章 ,写得很好,推荐给大件看看。具体就是看一些ffmpeg和mencoder的参数详解,这样让你之后的修改,也有的放失
http://blog.csdn.net/hemingwang0902/article/details/4382342
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
class ConvertVideo {
private List<String> pathRight = new ArrayList<String>();// 经处理后,得到的有效地址
private List<String> path1 = new ArrayList<String>();// ffmpeg能处理的文件的地址集
private List<String> path2 = new ArrayList<String>();// ffmpeg不能处理的文件的地址集
public static int fileNum = 0;// 所有经过验证合法,并需要转换的视频数量
public static void main(String[] args) {
Date start = new Date();
ConvertVideo conver = new ConvertVideo();
String fileFolder = "e:\\input";
List<String> listFile = conver.getFilesInPath(fileFolder);
List<String> listVideo = conver.filter(listFile);
int fileNumMax = listVideo.size(); // 所有视频数量
conver.checkfile(listVideo);
conver.process();
if (fileNum == fileNumMax) {
Date end = new Date();
System.out.println("耗时:" + (end.getTime() - start.getTime()) / 1000
+ "秒");
}
}
/**
* 过滤avi|wmv|rmvb|rm|asx|asf|mpg|3gp|mp4|mov|flv)$格式的视频
*/
private List<String> filter(List<String> list) {
List<String> fileList = new ArrayList<String>();
for (String str : list) {
if (str.matches(".+\\.(avi|wmv|rmvb|rm|asx|mkv|asf|mpg|swf|3gp|mp4|mov|vob|flv)$")) {
fileList.add(str);
}
}
return fileList;
}
/**
*
* 获取e:\\input下所有文件路径
*/
public List<String> getFilesInPath(String path) {
List<String> fileList = new ArrayList<String>();
if (path == null || "".equals(path))
return fileList;
File file = new File(path);
if (!file.exists()) {
return fileList;
}
File[] childFiles = file.listFiles();
try {
for (int i = 0; i < childFiles.length; i++) {
String filePath = childFiles[i].getAbsolutePath();
if (childFiles[i].isDirectory()) {
fileList.addAll(getFilesInPath(filePath));
} else {
fileList.add(filePath);
}
}
} catch (Exception e) {
return fileList;
}
return fileList;
}
/**
*
* 避免文件重名,在文件尾部加唯一标识,主要是以获取当前时间,以字符串格式hhmmssSSSSSS
*/
public String transform(Date date) {
SimpleDateFormat sdFormat = new SimpleDateFormat("hhmmssSSSSSS");
String myTime = sdFormat.format(date);
return myTime;
}
/**
* 核心处理函数
*/
public void process() {
checkContentType(pathRight);
pathRight.clear();
if (path1.size() > 0) { // 地址集中的文件全部是ffmpeg所能解析的文件
processFLV(path1); // 直接将文件转为flv文件
}
if (path2.size() > 0) {
processAVI(path2); // 得到ffmpeg不能解析的文件所转换成avi文件的地址集
}
}
/**
* 将传过来的地址集分类,ffmpeg能解析的分到path1中,ffmpeg不能解析的分到path2中
*/
public void checkContentType(List<String> list) {
for (String str : list) {
if (str.matches(".+\\.(avi|wmv|mkv|asx|swf|asf|vob|mpg|mp4|mov|flv)$")) {
path1.add(str);
} else {
path2.add(str);
}
}
}
/**
* . 处理用户传递过来的地址集 有效的放到pathRight中 无效的放到pathWrong中
*/
public void checkfile(List<String> path) {
for (int i = 0; i < path.size(); i++) {
File file = new File((String) path.get(i));
if (file.isFile()) {
pathRight.add(path.get(i));
}
}
}
/**
* 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
*/
public void processAVI(List<String> list) {
List<String> finish = new ArrayList<String>();
for (String str : list) {
List<String> commend = new java.util.ArrayList<String>();
commend.add("\"e:\\mencoder\"");
commend.add("\"" + str + "\"");
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");
String file = str.substring(str.lastIndexOf("\\") + 1,
str.lastIndexOf("."));
file = (file + transform(new Date())).trim();
commend.add("\"e:\\System\\" + file + ".avi\""); // 最后输出出来的avi,尽量不要出现二义性,否则会覆盖掉原有的视频
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
Process p = builder.start();
int exitValue = doWaitFor(p);
if (exitValue != -1) {
processFLV1("e:\\System\\" + file + ".avi");
}
} catch (Exception e) {
// e.printStackTrace();
System.out.println("********avi转换出错********");
}
finish.add(str);
}
path2.removeAll(finish);
}
/**
* ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
*/
public boolean processFLV1(String str) {
List<String> commend = new java.util.ArrayList<String>();
commend.add("\"e:\\ffmpeg\"");
commend.add("-i");
commend.add("\"" + str + "\"");
commend.add("-ab");
commend.add("64");
commend.add("-ac");
commend.add("2");
commend.add("-ar");
commend.add("22050");
commend.add("-b");
commend.add("230");
commend.add("-r");
commend.add("29.97");
commend.add("-y");
String file = str.substring(str.lastIndexOf("\\") + 1,
str.lastIndexOf("."));
String fileName = "e:\\output\\" + file + ".flv";
commend.add("\"" + fileName + "\"");
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
Process p = builder.start();
int exitValue = doWaitFor(p);
if (exitValue != -1) {
fileNum++;
}
processImg(fileName);
} catch (Exception e) {
System.out.println("*********转换为FLV格式出错*********");
// e.printStackTrace();
return false;
}
deleteFile(str);
return true;
}
public void processFLV(List<String> list) {
List<String> finish = new ArrayList<String>();
for (String str : list) {
List<String> commend = new java.util.ArrayList<String>();
commend.add("\"e:\\ffmpeg\"");
commend.add("-i");
commend.add("\"" + str + "\"");
commend.add("-ab");
commend.add("64");
commend.add("-ac");
commend.add("2");
commend.add("-ar");
commend.add("22050");
commend.add("-b");
commend.add("230");
commend.add("-r");
commend.add("29.97");
commend.add("-y");
String file = str.substring(str.lastIndexOf("\\") + 1,
str.lastIndexOf("."));
String fileName = "e:\\output\\" + file + transform(new Date())
+ ".flv";
commend.add("\"" + fileName + "\"");
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
Process p = builder.start();
int exitValue = doWaitFor(p);
if (exitValue != -1) {
fileNum++;
processImg(fileName);
}
} catch (Exception e) {
// System.out.println("*********转换为FLV格式出错*********");
e.printStackTrace();
}
finish.add(str);
}
path1.removeAll(finish);
}
/**
* 生成图片 参数String newfilename, String newimg
*/
public boolean processImg(String str) {
List<String> commend = new java.util.ArrayList<String>();
commend.add("\"e:\\ffmpeg\"");
commend.add("-i");
commend.add("\"" + str + "\"");
commend.add("-y");
commend.add("-f");
commend.add("image2");
commend.add("-ss");
commend.add("5");
commend.add("-t");
commend.add("0.001");
commend.add("-s");
commend.add("320x240");
commend.add("\"e:\\img\\"
+ str.substring(10, str.lastIndexOf(".")) + ".jpg\"");
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.start();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public void deleteFile(String str) {
File file = new File(str);
file.delete();
}
/**
* ffmpeg不能转换的格式要先转换成avi的格式,才转化为flv格式,doWaitFor方法保证,原视频完全转化为avi后,
* 才转化成flv,避免avi,flv同时转换出错
*/
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) {
// Print the output of our system call
Character c = new Character((char) in.read());
System.out.print(c);
}
while (err.available() > 0) {
// Print the output of our system call
Character c = new Character((char) err.read());
System.out.print(c);
}
// Ask the process for its exitValue. If the process
// is not finished, an IllegalThreadStateException
// is thrown. If it is finished, we fall through and
// the variable finished is set to true.
exitValue = p.exitValue();
finished = true;
} catch (IllegalThreadStateException e) {
// Process is not finished yet;
// Sleep a little to save on CPU cycles
Thread.currentThread().sleep(500);
}
}
} catch (Exception e) {
// unexpected exception! print it out for debugging...
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 completion status to caller
return exitValue;
}
}
分享到:
相关推荐
在本文中,我们将深入探讨如何使用Java程序调用FFmpeg执行视频文件格式转换,特别是将非FFmpeg原生支持的格式转换为FLV格式。FFmpeg是一个强大的多媒体处理工具,支持多种视频、音频格式的编码、解码和转换。在这个...
本文将深入探讨如何使用纯Java代码实现视频转码至FLV(Flash Video)格式,并支持在线播放,而不依赖任何第三方库,从而确保高效、快速的转码过程。 首先,我们需要了解FLV格式。FLV是一种流行的网络流媒体格式,...
总结来说,这个Java源码转换FLV的项目是利用Java编程语言和相关库实现的视频转换工具,它可以将源视频文件转化为适用于网络播放的FLV格式。理解和使用这个项目,你需要熟悉Java编程、视频处理概念以及可能涉及的第三...
Easy-FLV 是一个用 Java 实现的库,它能够将 RTSP 或 RTMP 视频流转换为 FLV 格式,以便在浏览器中播放。它为实时视频监控、直播和视频流处理提供了一个高效、稳定且易于集成的解决方案。高效转换:快速将视频流转换...
在这个压缩包中,包含了一个名为`ffmpeg.exe`的文件,这是FFmpeg的Windows可执行文件,可以直接运行在Windows操作系统上进行视频转换。 在Java中调用FFmpeg进行视频转换,我们可以利用Java的`Runtime.getRuntime()....
本篇文章将详述如何使用开源工具ffmpeg和mencoder将不同格式的视频文件转换为FLV(Flash Video)格式,以及如何从这些视频文件中提取第一帧作为图片。同时,我们还会提及如何在C#环境中调用这些工具,实现自动化处理...
9. **性能优化**:对于大量视频转换,优化转换速度和资源使用非常重要。这可能涉及到多线程处理、硬件加速等技术。 10. **质量控制**:转换后应进行质量检查,确保视频和音频的同步,避免出现画面失真或音画不同步...
在这个场景下,我们讨论的是如何使用`mpplay`来生成`flv`视频的缩略图。 首先,我们需要理解视频缩略图的作用。缩略图是视频内容的快速预览,它能帮助用户在不播放整个视频的情况下了解其大概内容。对于网站、应用...
Java调用FFmpeg转换视频格式为FLV是一个常见的任务,特别是在开发媒体处理应用程序时。FFmpeg是一个强大的跨平台命令行工具,用于处理音频和视频文件,包括转换、编码、解码、分割等操作。在Java中,我们通常通过...
Java视频转换FLV是一项在IT领域中常见的任务,主要用于将不同格式的视频文件转换为FLV(Flash Video)格式,这种格式广泛应用于网络流媒体播放。在这个过程中,我们通常会用到开源工具FFmpeg,它是一个强大的命令行...
在C#中,进行视频转换还需要对文件进行读写操作,这涉及到System.IO命名空间下的类,如FileStream、StreamReader、StreamWriter等。 8. **多线程与异步编程**: 为了提高转换效率,可以利用多线程或异步编程技术...
因此,视频转换为FLV后,可以与SWF结合使用,实现网页中的流媒体播放。 总之,将视频转换为FLV格式是在线视频发布的重要环节。通过选择合适的转换工具,设置适当的参数,我们可以有效地将各种格式的视频转化为适应...
5. **打包与写入**:将压缩后的音频和视频数据按照特定的容器格式(如MP4、FLV等)进行打包,并写入新的压缩视频文件。 6. **错误处理和性能优化**:在编码过程中,需要考虑错误处理,比如数据丢失或不完整的情况。...
本项目是一款基于Java技术栈的视频处理工具源码,集成了视频压缩与格式转换功能,特别针对FLV到MP4的转换。项目结构包含40个文件,其中Java源文件28个,HTML文件2个,并涉及其他类型的文件如属性文件、Markdown文件...
本实例聚焦于Java如何实现AMR到MP3的转换,同时,该方法同样适用于其他类型的格式转换,如视频格式FLV转MP4。我们将探讨使用JAVE库、FTP协议以及Base64编码等相关技术。 首先,让我们深入了解JAVE(Java Audio ...
本文将介绍如何使用 Java 将 M3U8 格式转换为视频文件的方法。 M3U8 格式转换为视频文件的方法 M3U8 文件是一种文本文件,包含了一系列的视频文件路径信息。要将 M3U8 文件转换为视频文件,需要将这些视频文件合并...
该软件支持所有视频格式文件转换为flv格式
刚开始学java就一直在想用java生成视频 以前用java做了个屏幕录制加录音 不过生成的不是标准的视频文件 无法通过播放器播放 下载的人还不少 因此这次参考了FLV文件规范 通过原生java生成FLV视频文件 录屏加录音 ...
5. **截图**: 从转换后的FLV文件中截取图像,并保存至`imgfile`目录下,便于预览或缩略图展示。 ### 六、总结 将各种视频文件转换为FLV格式在ASP.NET环境下是一个综合性的技术挑战,涉及前端用户界面设计、后端...