`
zy116494718
  • 浏览: 476693 次
  • 性别: 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的使用示例

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

    FFMPEG android实例

    这个"FFMPEG android实例"很可能是将FFmpeg库与Android应用相结合的一个具体项目,旨在展示如何在Android设备上操作FFmpeg进行多媒体操作。 FFmpeg 包含的主要组件有: 1. **ffmpeg**:这是一个命令行工具,可以...

    C++ FFMpeg实例

    本实例将重点讲解如何利用FFmpeg库从摄像头URL地址采集视频并进行播放。 首先,你需要在你的项目中引入FFmpeg的头文件和库。确保已经正确安装了FFmpeg,并将其路径添加到编译器的搜索路径中。通常,这涉及到`#...

    java后台利用ffmpeg实现将视频截取某一帧图片并保存

    2. **创建FFmpeg实例**:在Java代码中,首先需要创建一个`org.bytedeco.javacpp.Loader`的实例,然后加载`ffmpeg`的库。这样可以确保FFmpeg的动态链接库被正确加载。 ```java import org.bytedeco.javacpp.Loader; ...

    ffmpeg 拓展配置文件

    你可以通过PHP的`new \FFMpeg\FFMpeg()`来创建一个FFmpeg实例,然后利用其提供的API进行多媒体操作,例如: ```php use FFMpeg\FFMpeg; use FFMpeg\Coordinate\TimeCode; use FFMpeg\Format\Video\X264; $ffmpeg =...

    PHP-FFMpeg.zip

    安装完成后,你可以通过以下方式创建一个 PHP-FFMpeg 实例并开始处理视频: ```php use FFMpeg\FFMpeg; use FFMpeg\FFProbe; $ffmpeg = FFMpeg::create(); $ffprobe = FFProbe::create(); $video = $ffmpeg-&gt;open...

    编译WebRTC时替换的ffmpeg.zip

    3. **依赖库冲突**:系统可能存在其他FFmpeg实例或者其依赖库版本冲突,影响WebRTC的编译。 4. **源代码问题**:FFmpeg或WebRTC的源代码可能存在bug,导致编译时出错。 在这种情况下,"编译WebRTC时替换的ffmpeg....

    PHP-FFMpeg

    2. **初始化**:在PHP代码中,创建FFMpeg实例,指定要处理的视频文件路径。 3. **定义操作**:使用提供的方法,如`FFMpeg\Video::resize()`、`FFMpeg\Video::setKiloBitrate()`等来设置处理参数。 4. **输出配置**:...

    旧版的 php_ffmpeg扩展

    这段代码首先创建一个FFMpeg实例,打开输入的MP4文件,然后定义WebM格式,设置转换回调并在执行前输出提示信息,最后保存转换后的文件。 5. **限制与注意事项** 由于这是一个旧版的扩展,可能不支持最新的FFmpeg...

    ffmpeg播放H264视频流

    它可能包含初始化FFmpeg实例、设置输入流、配置输出格式以及处理解码后的数据等功能。 4. **性能优化**:由于WebAssembly运行在JavaScript引擎上,可能会受到性能限制,特别是在处理高分辨率和高帧率视频时。因此,...

    ffmpeg压缩java实例

    在Java开发中,通过调用FFmpeg的命令行工具,可以方便地集成到应用程序中进行视频处理,例如本实例中的视频压缩。在百度AI和腾讯AI的活体验证场景中,高质量、低大小的视频文件是必要的,因此使用FFmpeg进行视频压缩...

    C# FFMpeg Api 推流

    - 初始化FFMpeg实例,设置输入源(如本地视频文件或摄像头捕获)。 - 创建推流配置,包括目标服务器地址、端口、流媒体协议和流ID。 - 调用FFMpeg API开始推流。 - 监控推流状态,处理错误和异常。 - 完成推流...

    FFmpeg音频解码实例

    在本实例中,我们将探讨如何在Visual Studio 2008环境下,利用FFmpeg SDK 3.2进行音频解码。 首先,安装FFmpeg SDK 3.2是开发的基础。你需要下载并解压FFmpeg源代码,然后通过configure脚本配置编译环境,生成适用...

    window平台FFmpeg开发实例

    本实例将详细介绍如何在Windows上使用Msys2环境来编译FFmpeg 4.3.1版本,并构建适用于win32和x64架构的库文件及示例程序。 首先,Msys2是一个轻量级的Unix-like环境,为Windows提供了GCC编译器和各种Unix工具。要...

    FFmpeg音频编码实例

    在这个"FFmpeg音频编码实例"中,我们将重点探讨如何利用FFmpeg库在Visual Studio 2008环境下进行音频编码。FFmpeg 3.2是该项目的一个稳定版本,提供了丰富的API和功能,使得开发者能够方便地处理各种音频格式。 ...

    FFmpeg的delphi实例

    在"FFmpeg的delphi实例"中,我们看到的文件列表包括`testUnit1.dfm`、`testProject.dpr`、`testProject.dproj`和`testUnit1.pas`。这些文件是Delphi工程的基本组成部分: 1. `testUnit1.dfm`:这是Delphi中的一个...

    ffmpeg编译使用实例

    以下是对"ffmpeg编译使用实例"的具体解析: 1. **FFmpeg编译流程**: - 获取源码:首先,你需要从FFmpeg的官方网站或GitHub仓库下载源代码。 - 配置选项:根据需求配置编译选项,例如添加解码器、编码器、过滤器...

    ffmpeg 编译环境

    总之,FFmpeg 编译环境的建立是一项技术性的工作,但通过这个过程,你可以获得一个完全定制且适应你特定需求的 FFmpeg 实例。这对于开发自定义的多媒体应用、进行性能优化或支持特殊格式的音视频处理来说是非常有...

    基于PHP的FFmpeg视频的缩略图制作.zip

    在这个例子中,我们通过`FFMpeg::create()` 创建FFmpeg实例,然后打开视频文件,`frame()` 方法用于获取指定时间的帧,最后保存为图片文件。 注意,生成缩略图时选择的时间点应根据实际需求调整,例如视频开头、...

    FFmpeg播放器实例代码下载

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

Global site tag (gtag.js) - Google Analytics