`
xiaohlang
  • 浏览: 91900 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java调用FFmpeg及mencoder转换视频为FLV并截图

阅读更多
原文地址:

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;
		}
	}
 
}
分享到:
评论
1 楼 langwang0771 2012-03-08  
哥子,视频转换后不能播放!!!能不能给我你的源代码!!!

相关推荐

    用java程序调用ffmpeg执行视频文件格式转换flv

    在本文中,我们将深入探讨如何使用Java程序调用FFmpeg执行视频文件格式转换,特别是将非FFmpeg原生支持的格式转换为FLV格式。FFmpeg是一个强大的多媒体处理工具,支持多种视频、音频格式的编码、解码和转换。在这个...

    JAVA 利用 ffmpeg 和 mencoder 对视频进行转换

    在Java中使用FFmpeg,通常会借助于一些第三方库,如JNA(Java Native Access)或jni4net,这些库允许Java代码直接调用FFmpeg的C/C++接口。例如,可以创建一个Java方法,传递FFmpeg的命令行参数,然后通过`Runtime....

    利用ffmpeg、mencoder转换视频格式为FLV格式

    要将视频转换为FLV格式,使用FFmpeg的基本命令格式如下: ```bash ffmpeg -i 输入视频文件 -c:v libx264 -preset slow -crf 22 -c:a aac -b:a 128k 输出的FLV文件 ``` 这里,`-i` 参数指定输入视频文件,`-c:v ...

    基于FFMPEG和MENCODER的视频转换PHP网页.pdf

    在视频转换过程中,需要首先将视频文件上传到服务器,然后使用FFMPEG和MENCODER将其转换成FLV格式,最后将其嵌入PHP网页中。这个过程可以自动完成,无需人工干预。 PHP网页是指使用PHP语言编写的网页程序。PHP是一...

    Java使用ffmpeg和mencoder实现视频转码

    Java使用ffmpeg和mencoder实现视频转码是指使用Java语言调用ffmpeg和mencoder这两个流行的开源多媒体处理工具来实现视频转码的过程。视频转码是将视频文件从一种格式转换为另一种格式的过程,例如从AVI转换为MP4或从...

    详解java调用ffmpeg转换视频格式为flv

    详解java调用ffmpeg转换视频格式为flv 注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:WindowsSystem32下面 这几天在写一个视频管理系统,...

    ffmpeg+mencoder实现视频转码

    例如,使用FFmpeg进行视频转码的基本步骤如下: 1. **构建命令**:根据需要设置输入文件、输出文件、编码参数等,构建FFmpeg或MEncoder的命令行字符串。 2. **执行命令**:使用`Runtime.getRuntime().exec(command)...

    ffmpeg+mencoder两种视频转换成flv的文件

    在视频转换场景中,FFmpeg可以轻松地将多种视频格式转换为FLV,以适应网络播放需求。使用FFmpeg进行转换的基本命令如下: ```bash ffmpeg -i input_video.mp4 -c:v libx264 -preset slow -crf 22 -c:a aac -b:a 128...

    mencoder视频格式转换+ffmpeg视频截图DEMO

    在本DEMO中,mencoder被用来将视频转换为FLV格式,这是一种广泛应用于网络流媒体的格式,因其体积小、播放流畅而受到欢迎。转换过程通常包括以下步骤: 1. 首先,确定源视频文件的位置和输出目标。 2. 使用mencoder...

    ffmpeg+mencoder集合

    1. **音视频转换**:使用`-i`参数指定输入文件,`-c:v`和`-c:a`分别指定视频和音频编码器,`output.mp4`为输出文件名。例如: ``` ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4 ``` 2. **调整视频...

    java web ffmpeg memcoder视频转换为flash

    压缩包内的`java调用视频转换工具ffmpeg.doc`应该包含了如何在Java代码中使用FFmpeg的具体示例。通常需要编写一个Java工具类,封装FFmpeg的命令行调用,包括设置输入输出路径、编码参数等。 4. 使用说明文档:`java...

    ffmpeg、mencoder转码工具

    使用FFmpeg进行视频格式转换非常简单,基本命令结构如下: ``` ffmpeg -i 输入文件 -c:v 输出编码器 -c:a 输出音频编码器 输出文件 ``` 例如,将一个MP4文件转换为WebM格式: ``` ffmpeg -i input.mp4 -c:v libvpx-...

    ffmpeg和mencoder的总结

    其优势在于速度和效率,对于大批量的视频转换任务,MEncoder往往能提供更快的处理速度。 以下是FFmpeg和MEncoder的一些关键知识点: 1. **基本命令行用法**:两个工具都通过命令行接口操作,用户需要指定输入文件...

    FFmpeg和mencoder的音视频转码工具

    FFmpeg和mencoder是两个广泛使用的音视频转码工具,它们在数字媒体处理领域具有重要地位。FFmpeg是一个全面的开源项目,包含了多种用于处理音视频的库和工具,而mencoder则是MPlayer播放器的一部分,专为视频转码...

    ffmpeg+mencoder+使用说明

    要将RM或RMVB转换为FLV,首先你需要下载并安装FFmpeg和MEncoder。在这个压缩包中,"ffmpeg.zip"包含FFmpeg的源代码或预编译版本,而"MPlayer-mingw32-1.0rc2.zip"可能是MPlayer的Windows版本,其中也包含了MEncoder...

    java调用ffmpeg实现视频转换的方法

    Java调用FFmpeg实现视频转换涉及到Java编程语言和FFmpeg多媒体处理工具的使用。FFmpeg是一个非常强大的命令行工具,支持几乎所有的视频文件格式转换。在Java中调用FFmpeg,通常使用Runtime或者ProcessBuilder类来...

    java调用视频转换工具ffmpeg[归纳].pdf

    - `processFLV(String path)`:使用FFmpeg将文件转换为flv格式。 #### 三、注意事项 - **异常处理:** - 在实际应用中,需要考虑文件不存在、转换失败等异常情况,并添加相应的异常处理逻辑。 - **性能优化:**...

    视频转码工具ffmpeg.exe和mencoder.exe

    例如,如果你需要将一个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...

    mencoder+ffmpeg

    对于将视频文件转换为`.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视频格式转换

    在Java中使用FFmpeg,通常需要借助于一个Java库,如JAVE(Java Audio Video Encoder),它封装了FFmpeg的命令行操作,提供了一个友好的Java API。首先,你需要将FFmpeg添加到你的系统路径中,然后通过JAVE调用相应的...

Global site tag (gtag.js) - Google Analytics