Java实现视频格式转化

核心是利用ffmpeg进行视频转换,我们自己并不写转换视频的代码,只是调用ffmpeg,它会帮我们完成视频的转换。ffmpeg支持的类型有:asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等,这些类型,可以利用ffmpeg进行直接转换。ffmpeg不支持的类型有:wmv9,rm,rmvb等,这些类型需要先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式。

废话不大多说了,首先要把相关的库和要转化的视频准备好,如下图

下面就是代码部分了

package com.sino.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * java实现视频格式的转化
 * @author liuyazhuang
 *
 */
public class ChangeVideo {
	public static void main(String[] args) {
		ChangeVideo.convert("d:\\myeclipse\\aa.avi", "d:\\myeclipse\\bb.mp4");
	}

	/**
	 * @param inputFile:需要转换的视频
	 * @param outputFile:转换后的视频w
	 * @return
	 */
	public static boolean convert(String inputFile, String outputFile) {
		if (!checkfile(inputFile)) {
			System.out.println(inputFile + " is nokt file");
			return false;
		}
		if (process(inputFile, outputFile)) {
			System.out.println("ok");
			return true;
		}
		return false;
	}

	// 检查文件是否存在
	private static boolean checkfile(String path) {
		File file = new File(path);
		if (!file.isFile()) {
			return false;
		}
		return true;
	}

	/**
	 * @param inputFile
	 * @param outputFile
	 * @return
	 * 转换视频文件
	 */
	private static boolean process(String inputFile, String outputFile) {
		int type = checkContentType(inputFile);
		boolean status = false;
		if (type == 0) {
			status = processFLV(inputFile, outputFile);// 直接将文件转为flv文件
		} else if (type == 1) {
			String avifilepath = processAVI(type, inputFile);
			if (avifilepath == null)
				return false;// avi文件没有得到
			status = processFLV(avifilepath, outputFile);// 将avi转为flv
		}
		return status;
	}

	private static int checkContentType(String inputFile) {
		String type = inputFile.substring(inputFile.lastIndexOf(".") + 1,
				inputFile.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;
	}
	// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)直接转换为目标视频
	private static boolean processFLV(String inputFile, String outputFile) {
		if (!checkfile(inputFile)) {
			System.out.println(inputFile + " is not file");
			return false;
		}
		List<String> commend = new ArrayList<String>();

		commend.add(Constants.ffmpegPath);
		commend.add("-i");
		commend.add(inputFile);
		commend.add("-ab");
		commend.add("128");
		commend.add("-acodec");
		commend.add("libmp3lame");
		commend.add("-ac");
		commend.add("1");
		commend.add("-ar");
		commend.add("22050");
		commend.add("-r");
		commend.add("29.97");
		//高品质
		commend.add("-qscale");
		commend.add("6");
		//低品质
//		commend.add("-b");
//		commend.add("512");
		commend.add("-y");

		commend.add(outputFile);
		StringBuffer test = new StringBuffer();
		for (int i = 0; i < commend.size(); i++) {
			test.append(commend.get(i) + " ");
		}

		System.out.println(test);

		try {
			ProcessBuilder builder = new ProcessBuilder();
			builder.command(commend);
			builder.start();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
	// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
	// 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
	private static String processAVI(int type, String inputFile) {
		File file = new File(Constants.avifilepath);
		if (file.exists())
			file.delete();
		List<String> commend = new ArrayList<String>();
		commend.add(Constants.mencoderPath);
		commend.add(inputFile);
		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(Constants.avifilepath);
		StringBuffer test = new StringBuffer();
		for (int i = 0; i < commend.size(); i++) {
			test.append(commend.get(i) + " ");
		}

		System.out.println(test);
		try {
			ProcessBuilder builder = new ProcessBuilder();
			builder.command(commend);
			Process p = builder.start();

			final InputStream is1 = p.getInputStream();
			final InputStream is2 = p.getErrorStream();
			new Thread() {
				public void run() {
					BufferedReader br = new BufferedReader(
							new InputStreamReader(is1));
					try {
						String lineB = null;
						while ((lineB = br.readLine()) != null) {
							if (lineB != null)
								System.out.println(lineB);
						}
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}.start();
			new Thread() {
				public void run() {
					BufferedReader br2 = new BufferedReader(
							new InputStreamReader(is2));
					try {
						String lineC = null;
						while ((lineC = br2.readLine()) != null) {
							if (lineC != null)
								System.out.println(lineC);
						}
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}.start();

			// 等Mencoder进程转换结束,再调用ffmepg进程
			p.waitFor();
			System.out.println("who cares");
			return Constants.avifilepath;
		} catch (Exception e) {
			System.err.println(e);
			return null;
		}
	}
}

类ChangeVideo主要进行视频格式的转化

package com.sino.test;

/**
 * 常量类,主要设置可执行程序和动态链接库以及转化过程中生成的临时视频文件的位置
 * @author liuyazhuang
 *
 */
public class Constants {
	//ffmpeg存放的路径
	public static final String ffmpegPath = "d:\\myeclipse\\ffmpeg.exe";
	//mencoder存放的路径
	public static final String mencoderPath = "d:\\myeclipse\\mencoder.exe";
	//通过mencoder转换成的avi存放路径
	public static final String avifilepath = "d:\\myeclipse\\temp.avi";
}

常量类Constants ,主要设置可执行程序和动态链接库以及转化过程中生成的临时视频文件的位置

时间: 2024-12-26 11:54:38

Java实现视频格式转化的相关文章

AVI Player with Playmaker actions 视频格式转化之FFMPEG转化 (三)

前两篇大体介绍了一下AVI以及其简单的用法,这里补充一下两个函数这个是大部分视频播放器会用到的函数,但是AVI把这两个参数藏得很深,为了方便大家使用这里我就直接上代码,啥玩意你自己可以去看看注释,注意这个两个函数是放在MoviePlayer类里面的,代码如下: /// <summary> /// 获取视频总时长 /// </summary> /// <returns></returns> public float GetLastVideoTime() { i

主流视频格式介绍

现在存在各种视频太多了,工作需要,所以将它们都记录下来,至少也该知道它到底是怎么一回事,虽然没有办法去理解所有视频使用的算法,但是了解一下还是有必要的. MPEG Moving Picture Expert Group,即运动图像专家组格式,是以下MPEG-1.MPEG-2等视频格式的总称,VCD.SVCD.DVD就是这种格式.MPEG格式是运动图像 压缩算法的国际标准,它采用了有损压缩方法从而减少运动图像中的冗余信息. MPEG的压缩方法保留相邻两幅画面绝大多数相同的部分,而把后续图像中和前面

java视频格式转换代码

http://blog.163.com/zzf_fly/blog/static/20958915820127217443816/ package com.gkzx.online.action; import java.io.File;import java.io.IOException;import java.io.InputStream;import java.util.Date;import java.util.List; import org.apache.struts2.ServletA

C#使用FFmpeg 将视频格式转换成Gif图片示例

一.本次使用参数说明 /* * 参数说明: * -i 源文件位置 * -y 输出新文件,是否覆盖现有文件 * -s 视频比例 4:3 320x240/640x480/800x600 16:9 1280x720 ,默认值 'wxh',和原视频大小相同 * -f 等同'-formats',定义的可支持的文件格式'ffmpeg-formats',更多参考:https://ffmpeg.org/ffmpeg-formats.html * -vframes 数字类型,指定视频输出帧数 * -dframes

Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能

视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash制作的播放器来播放该文件.项目中用制作的player.swf播放器. 多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能.视频格式转换.视频抓图.给视频加水印等. ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用. 1.能支持的格式 ffmpeg能解析的格式:

Java将视频转为缩略图--ffmpeg

Java生成视频缩略图 对于上传视频生成缩略图使用的是ffmpeg进行生成的. 自己在网上找了如何进行编译ffmpeg的方法 但是感觉太复杂了 就到csdn上找到了编译好的ffmpeg文件 体会到ffmpeg非常强大,大部分流行的视频格式的都能生成缩略图 现在开始 首先下载ffmpeg解压 方法一: 建立一个bat文件 start E:/ffmpeg/bin/ffmpeg.exe -i %1 -ss 20 -vframes 1 -r 1 -ac 1 -ab 2 -s 160*120 -f ima

Atitit.多媒体区----web视频格式的选择总结

Atitit.多媒体区----web视频格式的选择总结 1. 因为现阶段不同的浏览器支持的视频格式是不同的 1 2. 各浏览器Html5 Video支持的影音格式: 2 3. 解决方案是什么?Flash和H.264 2 4. <object> 标签用于包含对象,比如图像.音频.视频.Java applets.ActiveX.PDF 以及 Flash. 3 1. 因为现阶段不同的浏览器支持的视频格式是不同的 ,当我们有多种格式的视频样式的时候,我们会用第二种写法来做兼容调试.一般 谷歌 mp4(

Android加入新的视频格式--媒体库扫描

需求:在mediaprovider数据库中加入.mov后缀格式的视频文件 能够使用工具MediaInfo_GUI_0.7.67_Windows.3243836749.exe 查看mov文件编码格式类型,能够到http://download.csdn.net/detail/deng0zhaotai/8767089下载. 概要 完整名称 : D:\好歌曲学员合.mov 文件格式 : MPEG-4 格式简单介绍 : QuickTime 编码设置ID : qt 文件大小 : 83.8 MiB 长度 :

Java 生成视频缩略图(ffmpeg) &lt;第五篇&gt;

对于上传视频生成缩略图使用的是ffmpeg进行生成的. 自己在网上找了如何进行编译ffmpeg的方法 但是感觉太复杂了 就到csdn上找到了编译好的ffmpeg文件 下载下来 给大家一个下载地址 http://download.csdn.net/source/453719 体会到ffmpeg非常强大,大部分流行的视频格式的都能生成缩略图 现在开始 首先下载ffmpeg解压 建立一个bat文件 start E:/ffmpeg/bin/ffmpeg.exe -i %1 -ss 20 -vframes