ffmpeg学习

代码地址:https://gitee.com/panmingshuai/ffmpeg-demo.git

代码荡下来后,resource目录下有一个ffmpeg.zip的压缩包,解压放到E:\ffmpeg下:

然后我们利用java调用ffmpeg的命令执行视频的相关操作:

将视频转为flv格式

public static void processFLV() throws IOException {
		List<String> commend = new ArrayList<String>();
		commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置
		commend.add("-i");
		commend.add("E:\\qwe.mp4");
		commend.add("-ab");
		commend.add("56");
		commend.add("-ar");
		commend.add("22050");
		commend.add("-qscale");
		commend.add("8");
		commend.add("-r");
		commend.add("15");
		commend.add("-s");
		commend.add("600x500");
		commend.add("E:\\qwenew.flv");

		ProcessBuilder builder = new ProcessBuilder();
		builder.command(commend);
		builder.start();
	}

这里的-i表示需要操作的文件的路径,命令最后的路径表示处理好的文件存放的路径和文件名,记得写上.flv。

指定格式的转换

// 指定格式转换 但是这里没有设置其他参数,所以生成的文件以ffmpeg内置的生成
	// MP4转avi c:\ffmpeg\ffmpeg -i c:\ffmpeg\input\c.mp4 -f avi
	// c:\ffmpeg\output\a.avi
	public static void process() throws IOException {
		List<String> commend = new ArrayList<String>();
		commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置
		commend.add("-i"); // 指定要处理的文件
		commend.add("E:\\qwe.mp4");
		commend.add("-f"); // 指定转换格式
		commend.add("avi");
		commend.add("E:\\qwe2.avi"); // 最后指定文件输出的路径

		ProcessBuilder builder = new ProcessBuilder();
		builder.command(commend);
		builder.start();
	}

这里的-f表示指定什么格式进行强制转换,这里选了人见人爱的avi格式。

视频截图:

// 截图
	// ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg
	public static void cutScreen() throws IOException {
		List<String> commend = new ArrayList<String>();
		commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置
		commend.add("-i");
		commend.add("E:\\qwe.mp4");
		commend.add("-y");// 输出覆盖路径,即如果已存在下面指定路径的文件,则覆盖掉
		commend.add("-f");
		commend.add("image2");
		commend.add("-ss"); // 指定在哪截图
		commend.add("5");
		commend.add("-t"); // 指定要记录的时间,因为是截图所以是0.001s
		commend.add("0.001");
		commend.add("-s");
		commend.add("1920x1080");
		commend.add("E:\\qwe3.jpg");

		ProcessBuilder builder = new ProcessBuilder();
		builder.command(commend);
		builder.start();
	}

这里的-ss表示在视频的哪里截图,他的单位是秒,即也可以用HH:mm:ss的形式。还有一种按多少帧截图的,但是感觉不实用,一般人都是说在多少时间截图,没听过谁要求在多少帧截图的。-t表示视频截得时间持续多久,单位也是秒,因为是截图所以设定为0.001秒。-s表示截图的长宽多少。

截取视频段:

// 截取视频
	public static void cutVedio() throws IOException {
		List<String> commend = new ArrayList<String>();
		commend.add("E:\\ffmpeg\\ffmpeg"); // ffmpeg文件的位置
		commend.add("-i");
		commend.add("E:\\qwe.mp4");
		commend.add("-vcodec");//视频使用原来一样的视频编解码器。
		commend.add("copy");
		commend.add("-acodec");//音频使用原来一样的音频编解码器。
		commend.add("copy");
		commend.add("-ss");
		commend.add("00:00:25");
		commend.add("-t");
		commend.add("10");
		commend.add("E:\\qwe563.mp4");
		commend.add("-y");

		ProcessBuilder builder = new ProcessBuilder();
		builder.command(commend);
		builder.start();
	}

这段出现的都是之前介绍过的,就不多说了

下面列出一些常用的ffmpeg的命令,可以像上面一样调用

-L license

-h 帮助

-fromats 显示可用的格式,编解码的,协议的。。。

-f fmt 强迫采用格式fmt

-I filename 输入文件

-y 覆盖输出文件

-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持

-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持

-title string 设置标题

-author string 设置作者

-copyright string 设置版权

-comment string 设置评论

-target type 设置目标文件类型(vcd,svcd,dvd) 

视频选项:

-b bitrate 设置比特率,缺省200kb/s

-r fps 设置帧频 缺省25

-s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576

-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777

-vn 不做视频记录

-bt tolerance 设置视频码率容忍度kbit/s

-vcodec codec 强制使用codec编解码方式。如果用copy表示原始编解码数据必须被拷贝。

-pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率

音频选项:

-ac channels 设置通道 缺省为1

-an 不使能音频纪录

-acodec codec 使用codec编解码

猜你喜欢

转载自my.oschina.net/u/3534905/blog/1784764