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

ffmpeg实例

阅读更多

        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);       
		            Process process = builder.start();
                            doWaitFor(process); //加上这句可以保证转码程序走完后才进行下面的java语句,方便进行测试转码时间等。
      
		            } 
		        catch (Exception e) {           
		        	mark = false; 
		            System.out.println(e);         
		            e.printStackTrace();    
		            } 
		            return mark; 
		} 

	    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;
	    }

 

 

 

    视频按某一时间截图:

       

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秒(最后一张都是截最后一秒的)。

1
1
分享到:
评论
4 楼 bewithme 2015-08-31  
zy116494718 写道
bewithme 写道
Ffmpeg 这个类哪里来的?楼主你偷来的吗?

这个实例的类名是Ffmpeg,没都贴上来

一起贴上来啊
3 楼 zy116494718 2015-08-31  
bewithme 写道
Ffmpeg 这个类哪里来的?楼主你偷来的吗?

这个实例的类名是Ffmpeg,没都贴上来
2 楼 bewithme 2015-08-28  
Ffmpeg 这个类哪里来的?楼主你偷来的吗?
1 楼 comsci 2015-08-28  

   众人拾柴.....火焰高

相关推荐

    FFMPEG android实例

    别人的一个android FFMPEG 实例,分享一下,顺便自己保存资源

    ffmpeg的使用示例

    博文 http://blog.csdn.net/i_scream_/article/details/52716849 中的代码和相关资料。测试环境为ubuntu16.04.

    C++ FFMpeg实例

    从摄像头URL地址采集,播放视频,方便学习FFMPEG的拉流,采集应用。

    ffmpeg压缩java实例

    ffmpeg视频压缩java实例,可用于百度AI以及腾讯AI活体验证的视频压缩。。。。。。。。

    FFmpeg cpp 实例代码

    FFmpeg cpp 实例代码

    FFmpeg音频解码实例

    vs2008下用FFmpeg SDK3.2开发的音频解码小实例

    FFmpeg音频编码实例

    基于vs2008的FFmpeg SDK3.2开发的音频编码实例

    FFmpeg播放器实例代码下载

    使用C++封装FFmpeg,编写的播放音视频的实例,在MFC控件显示播放,可以播放本地文件,也可以播放网络流, 主要描述了ffmpeg音视频解码的详细步骤,SDL和MFC控件关联显示,音视频同步的控制,本实例使用VS2012开发。

    用Ffmpeg进行h265编解码的实例

    这是一个用Ffmpeg进行h265编解码的实例,集成了demux,解码,编码相关的代码。

    Delphi FFMpeg + BASS实例

    使用Delphi开发的FFMpeg + BASS例子,本例子简单的实现FFMpeg音视频解码播放。例子中给出了音频及视频的简单处理以及渲染方法。例子为纯FFMpeg API调用,无需安装FFVCL等控件。

    ffmpeg编译使用实例

    ffmpeg编译使用实例,教你如何使用jni编译ffmpeg,进行视频格式转换,压缩,加水印等等

    FFmpeg的delphi实例

    利用ffmpeg进行开发的delphi例子

    window平台FFmpeg开发实例

    使用Msys2 编译最新版本FFmpeg-4.3.1 ,包含最简洁的编译手册、编译好的win32\x64 版本的lib\dll及vs2019+ffmpeg demo

    ffmpeg视频解码和编码代码实例

    ffmpeg视频解码和编码代码实例。decoder目录中的代码是对视频进行解码的实例。encoder目录中的代码是对视频进行编码的实例。

    ffmpeg filter过滤器基础实例以及全面解析

    ffmpeg filter过滤器基础实例以及全面解析,pdf版,内容丰富,便于理解

    ffmpeg +SDL 视频播放实例(目前只能显示视频,没有声音)

    ffmpeg +SDL 视频播放实例(目前只能显示视频,没有声音)

    FFMpeg基础库编程开发

    第十章 开发实例 436 第十一章 mp4文件封装协议分析 436 第十二章 flv 文件格式分析 457 附录A:常见问题 465 1 ffmpeg 从内存中读取数据 465 2 MFC中使用SDL播放音频没有声音的解决方法 465 附录B:经典代码示例 ...

    ffmpeg案例2

    ffmpeg案例JAVA通过jni调用ffmpeg函数输出ffmpeg支持的协议,封装的格式、支持的编解码器,支持的滤镜,配置信息。

    ffmpeg学习示例(part3)

    参考雷霄骅的ffmpeg player示例,修正了源代码中的大量的bug,增加了代码的规范性,更适合ffmpeg初学者学习(因文件较大,分为2部分上传,用户下载完成后,可直接把两个文件夹下的工程合并即可)

Global site tag (gtag.js) - Google Analytics