首页 > 其他 > 详细

ffmpeg实例

时间:2015-08-28 02:39:09      阅读:283      评论:0      收藏:0      [点我收藏+]

??????? FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它可以用来进行转码和批量截图工作。

??????? 首先先下载FFmpeg,然后解压缩后配置环境变量,系统变量中的PATH添加e:\ffmpeg\bin; 然后就可以用cmd执行ffmpeg命令了。

??????? java中使用FFmpeg代码如下:

???????

public static void main(String[] args) {   
		try { 
		 
		boolean result1= new Ffmpeg().executeCodecs("E:\\ffmpeg\\bin\\ffmpeg", "E:\\video\\2015\\7\\3a046fd921a40b1c8b47e00dd79f3656.mp4", "E:\\video\\2015\\7\\output.flv"); 
		boolean result2= new Ffmpeg().cutPic("E:\\ffmpeg\\bin\\ffmpeg", "E:\\video\\2015\\7\\76c1a7f63d12a45a14d1a2c68879c0a6.mp4", "E:\\video\\2015\\7\\z%d.png"); 
		
		} catch (Exception e) {   
			  e.printStackTrace(); 
		 
		} 
	} 
		 
		/**      
		 	 * 视频转码 
		     * @param ffmpegPath    转码工具的存放路径 
		     * @param upFilePath    用于指定要转换格式的文件,要截图的视频源文件  
		     * @param codcFilePath    格式转换后的的文件保存路径    
		     * @return 
		     *            视频转换
			 *	ffmpeg -i my_video.mpeg -s 500×500 my_video.flv
			 *	-i 后为源视频文件, -s 表示设置目标视频文件的分辨率   my_video.flv为目的视频文件
		     * @throws Exception 
			 *高清转码参数
			 *普通转码参数
				

		     */ 
		    public boolean executeCodecs(String ffmpegPath, String upFilePath, 
		    			String codcFilePath) throws Exception { 
		    	
		    	System.out.println("begin");
		    	
		        // 创建一个List集合来保存转换视频文件为flv格式的命令     
		    	List<String> convert = new ArrayList<String>();        
		    	convert.add(ffmpegPath); // 添加转换工具路径 
		        convert.add("-i"); // 添加参数"-i",该参数指定要转换的文件       
		        convert.add(upFilePath); // 添加要转换格式的视频文件的路径   
		        convert.add("-qscale");     //指定转换的质量      
		        convert.add("6"); 
		        convert.add("-ab");        //设置音频码率      
		        convert.add("64"); 
		        convert.add("-ac");        //设置声道数  
		        convert.add("2"); 
		        convert.add("-ar");        //设置声音的采样频率      
		        convert.add("22050"); 
		        convert.add("-r");        //设置帧频       
		        convert.add("24"); 
		        convert.add("-y"); // 添加参数"-y",该参数指定将覆盖已存在的文件       
		        convert.add(codcFilePath);       
		        boolean mark = true; 
		        ProcessBuilder builder = new ProcessBuilder();      
		        try { 
		            builder.command(convert); 
		            builder.redirectErrorStream(true);       
		            builder.start();      
		            } 
		        catch (Exception e) {           
		        	mark = false; 
		            System.out.println(e);         
		            e.printStackTrace();    
		            } 
		            return mark; 
		} 

?

??? 视频按某一时间截图:

? ?? ??

ffmpeg -i test.asf -y -f  image2  -ss 00:01:00 -vframes 1  test1.jpg
or
ffmpeg -i test.asf -y -f  image2  -ss 60 -vframes 1  test1.jpg

?

??? 这个抽取的是第1分钟的截图。

?

??? 视频按固定时间批量截图:

???

		boolean result2= new Ffmpeg().cutPic("E:\\ffmpeg\\bin\\ffmpeg", "E:\\video\\2015\\7\\76c1a7f63d12a45a14d1a2c68879c0a6.mp4", "E:\\video\\2015\\7\\pic%d.png"); 

                   /**      * 视频截图 
		     * @param ffmpegPath  转码工具的存放路径
		     * @param upFilePath    要截图的视频源文件    
		     * @param picPath    截图保存路径    
		     *          连续截图 ffmpeg -i d:\\test\\test.wmv -r 1 d:\\test\%2d.jpg
		     *         起名字 >ffmpeg -i d:\\test\\test.wmv -r 1 d:\\test\%2d.jpg
		     *         每隔一秒截一张图
		     * ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
			 *		每隔20秒截一张图
			 *	ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png

		     * @return 
		     * @throws Exception    
		      */ 
		    public boolean cutPic(String ffmpegPath,String upFilePath, String picPath)throws Exception {       
		         // 创建一个List集合来保存从视频中截取图片的命令 
		    	System.out.println("begin"+new Date());
		        List<String> cutpic = new ArrayList<String>();    
		        cutpic.add(ffmpegPath);     
		        cutpic.add("-i"); 
		        cutpic.add(upFilePath); // 同上(指定的文件即可以是转换为flv格式之前的文件,也可以是转换的flv文件)     
		        cutpic.add("-y");      
		        cutpic.add("-f");     
		        cutpic.add("image2"); 
		        cutpic.add("-ss"); // 添加参数"-ss",该参数指定截取的起始时间        
		        cutpic.add("60"); // 添加起始时间为第17秒 
		  //      cutpic.add("-t"); // 添加参数"-t",该参数指定持续时间    
		  //      cutpic.add("0.001"); // 添加持续时间为1毫秒 
		        cutpic.add("-s"); // 添加参数"-s",该参数指定截取的图片大小     
		        cutpic.add("800*280"); // 添加截取的图片大小为350*240   
		        cutpic.add("-vf");
		        cutpic.add("fps=fps=1/30");  //每30秒截一张图
		        cutpic.add(picPath); // 添加截取的图片的保存路径        
		        boolean mark = true;        
		        ProcessBuilder builder = new ProcessBuilder();       
		        try { 
		            //截图指令 
		            builder.command(cutpic); 
		            builder.redirectErrorStream(true); 
		            // 如果此属性为 true,则任何由通过此对象的 start() 方法启动的后续子进
		            //程生成的错误输出都将与标准输出合并, 
		            //因此两者均可使用 Process.getInputStream() 方法读取。这使得关联错误消息和相应的输出变得更容易    
		            builder.start();       
		            } catch (Exception e) {      
		            	mark = false;  
		               e.printStackTrace();     
		            } 
		            return mark; 
		    }

????

??? 比如一个03:02秒的视图,会被截成5张图,第一张截图是1:15秒的,第二张是1:45秒,第三张是2:15秒,第四张是2:45秒,第五张是3:02秒(最后一张都是截最后一秒的)。

ffmpeg实例

原文:http://zy116494718.iteye.com/blog/2238438

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!