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秒(最后一张都是截最后一秒的)。
相关推荐
博文 http://blog.csdn.net/i_scream_/article/details/52716849 中的代码和相关资料。测试环境为ubuntu16.04.
这个"FFMPEG android实例"很可能是将FFmpeg库与Android应用相结合的一个具体项目,旨在展示如何在Android设备上操作FFmpeg进行多媒体操作。 FFmpeg 包含的主要组件有: 1. **ffmpeg**:这是一个命令行工具,可以...
本实例将重点讲解如何利用FFmpeg库从摄像头URL地址采集视频并进行播放。 首先,你需要在你的项目中引入FFmpeg的头文件和库。确保已经正确安装了FFmpeg,并将其路径添加到编译器的搜索路径中。通常,这涉及到`#...
2. **创建FFmpeg实例**:在Java代码中,首先需要创建一个`org.bytedeco.javacpp.Loader`的实例,然后加载`ffmpeg`的库。这样可以确保FFmpeg的动态链接库被正确加载。 ```java import org.bytedeco.javacpp.Loader; ...
你可以通过PHP的`new \FFMpeg\FFMpeg()`来创建一个FFmpeg实例,然后利用其提供的API进行多媒体操作,例如: ```php use FFMpeg\FFMpeg; use FFMpeg\Coordinate\TimeCode; use FFMpeg\Format\Video\X264; $ffmpeg =...
安装完成后,你可以通过以下方式创建一个 PHP-FFMpeg 实例并开始处理视频: ```php use FFMpeg\FFMpeg; use FFMpeg\FFProbe; $ffmpeg = FFMpeg::create(); $ffprobe = FFProbe::create(); $video = $ffmpeg->open...
3. **依赖库冲突**:系统可能存在其他FFmpeg实例或者其依赖库版本冲突,影响WebRTC的编译。 4. **源代码问题**:FFmpeg或WebRTC的源代码可能存在bug,导致编译时出错。 在这种情况下,"编译WebRTC时替换的ffmpeg....
2. **初始化**:在PHP代码中,创建FFMpeg实例,指定要处理的视频文件路径。 3. **定义操作**:使用提供的方法,如`FFMpeg\Video::resize()`、`FFMpeg\Video::setKiloBitrate()`等来设置处理参数。 4. **输出配置**:...
这段代码首先创建一个FFMpeg实例,打开输入的MP4文件,然后定义WebM格式,设置转换回调并在执行前输出提示信息,最后保存转换后的文件。 5. **限制与注意事项** 由于这是一个旧版的扩展,可能不支持最新的FFmpeg...
它可能包含初始化FFmpeg实例、设置输入流、配置输出格式以及处理解码后的数据等功能。 4. **性能优化**:由于WebAssembly运行在JavaScript引擎上,可能会受到性能限制,特别是在处理高分辨率和高帧率视频时。因此,...
在Java开发中,通过调用FFmpeg的命令行工具,可以方便地集成到应用程序中进行视频处理,例如本实例中的视频压缩。在百度AI和腾讯AI的活体验证场景中,高质量、低大小的视频文件是必要的,因此使用FFmpeg进行视频压缩...
- 初始化FFMpeg实例,设置输入源(如本地视频文件或摄像头捕获)。 - 创建推流配置,包括目标服务器地址、端口、流媒体协议和流ID。 - 调用FFMpeg API开始推流。 - 监控推流状态,处理错误和异常。 - 完成推流...
在本实例中,我们将探讨如何在Visual Studio 2008环境下,利用FFmpeg SDK 3.2进行音频解码。 首先,安装FFmpeg SDK 3.2是开发的基础。你需要下载并解压FFmpeg源代码,然后通过configure脚本配置编译环境,生成适用...
本实例将详细介绍如何在Windows上使用Msys2环境来编译FFmpeg 4.3.1版本,并构建适用于win32和x64架构的库文件及示例程序。 首先,Msys2是一个轻量级的Unix-like环境,为Windows提供了GCC编译器和各种Unix工具。要...
在这个"FFmpeg音频编码实例"中,我们将重点探讨如何利用FFmpeg库在Visual Studio 2008环境下进行音频编码。FFmpeg 3.2是该项目的一个稳定版本,提供了丰富的API和功能,使得开发者能够方便地处理各种音频格式。 ...
在"FFmpeg的delphi实例"中,我们看到的文件列表包括`testUnit1.dfm`、`testProject.dpr`、`testProject.dproj`和`testUnit1.pas`。这些文件是Delphi工程的基本组成部分: 1. `testUnit1.dfm`:这是Delphi中的一个...
以下是对"ffmpeg编译使用实例"的具体解析: 1. **FFmpeg编译流程**: - 获取源码:首先,你需要从FFmpeg的官方网站或GitHub仓库下载源代码。 - 配置选项:根据需求配置编译选项,例如添加解码器、编码器、过滤器...
总之,FFmpeg 编译环境的建立是一项技术性的工作,但通过这个过程,你可以获得一个完全定制且适应你特定需求的 FFmpeg 实例。这对于开发自定义的多媒体应用、进行性能优化或支持特殊格式的音视频处理来说是非常有...
在这个例子中,我们通过`FFMpeg::create()` 创建FFmpeg实例,然后打开视频文件,`frame()` 方法用于获取指定时间的帧,最后保存为图片文件。 注意,生成缩略图时选择的时间点应根据实际需求调整,例如视频开头、...
使用C++封装FFmpeg,编写的播放音视频的实例,在MFC控件显示播放,可以播放本地文件,也可以播放网络流, 主要描述了ffmpeg音视频解码的详细步骤,SDL和MFC控件关联显示,音视频同步的控制,本实例使用VS2012开发。