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秒(最后一张都是截最后一秒的)。
相关推荐
别人的一个android FFMPEG 实例,分享一下,顺便自己保存资源
博文 http://blog.csdn.net/i_scream_/article/details/52716849 中的代码和相关资料。测试环境为ubuntu16.04.
从摄像头URL地址采集,播放视频,方便学习FFMPEG的拉流,采集应用。
ffmpeg视频压缩java实例,可用于百度AI以及腾讯AI活体验证的视频压缩。。。。。。。。
FFmpeg cpp 实例代码
vs2008下用FFmpeg SDK3.2开发的音频解码小实例
基于vs2008的FFmpeg SDK3.2开发的音频编码实例
使用C++封装FFmpeg,编写的播放音视频的实例,在MFC控件显示播放,可以播放本地文件,也可以播放网络流, 主要描述了ffmpeg音视频解码的详细步骤,SDL和MFC控件关联显示,音视频同步的控制,本实例使用VS2012开发。
这是一个用Ffmpeg进行h265编解码的实例,集成了demux,解码,编码相关的代码。
使用Delphi开发的FFMpeg + BASS例子,本例子简单的实现FFMpeg音视频解码播放。例子中给出了音频及视频的简单处理以及渲染方法。例子为纯FFMpeg API调用,无需安装FFVCL等控件。
ffmpeg编译使用实例,教你如何使用jni编译ffmpeg,进行视频格式转换,压缩,加水印等等
利用ffmpeg进行开发的delphi例子
使用Msys2 编译最新版本FFmpeg-4.3.1 ,包含最简洁的编译手册、编译好的win32\x64 版本的lib\dll及vs2019+ffmpeg demo
ffmpeg视频解码和编码代码实例。decoder目录中的代码是对视频进行解码的实例。encoder目录中的代码是对视频进行编码的实例。
ffmpeg filter过滤器基础实例以及全面解析,pdf版,内容丰富,便于理解
ffmpeg +SDL 视频播放实例(目前只能显示视频,没有声音)
第十章 开发实例 436 第十一章 mp4文件封装协议分析 436 第十二章 flv 文件格式分析 457 附录A:常见问题 465 1 ffmpeg 从内存中读取数据 465 2 MFC中使用SDL播放音频没有声音的解决方法 465 附录B:经典代码示例 ...
ffmpeg案例JAVA通过jni调用ffmpeg函数输出ffmpeg支持的协议,封装的格式、支持的编解码器,支持的滤镜,配置信息。
参考雷霄骅的ffmpeg player示例,修正了源代码中的大量的bug,增加了代码的规范性,更适合ffmpeg初学者学习(因文件较大,分为2部分上传,用户下载完成后,可直接把两个文件夹下的工程合并即可)