java用ffmpeg插件来捕获视频第一帧
来源:互联网 发布:java写邮件qq邮箱 编辑:程序博客网 时间:2024/05/21 12:46
简介: 以下是一个完整的实现java捕获视频第一帧(最后一帧或固定时间)图片的方法,如果参阅此文章只需要把以下java代码完整拷贝下来作为util即可使用
代码之后有ffmpeg在linux下的完整安装教程.
1.获取视频信息
package com.qs.util.videoUtil;import java.io.*;import java.util.regex.Matcher;import java.util.regex.Pattern; public class VideoInfo { //视频路径 private String ffmpegApp; //视频时 private int hours; //视频分 private int minutes; //视频秒 private float seconds; //视频width private int width; //视频height private int heigt; public VideoInfo() {} public VideoInfo(String ffmpegApp) { this.ffmpegApp = ffmpegApp; } public String toString() { return "time: " +hours +":" + minutes +":" + seconds +", width = " + width + ", height= " + heigt; } public void getInfo(String videoFilename)throws IOException, InterruptedException { String tmpFile = videoFilename + ".tmp.png"; ProcessBuilder processBuilder = new ProcessBuilder(ffmpegApp,"-y", "-i", videoFilename, "-vframes", "1", "-ss", "0:0:0", "-an", "-vcodec", "png", "-f", "rawvideo", "-s", "100*100", tmpFile); Process process = processBuilder.start(); InputStream stderr = process.getErrorStream(); InputStreamReader isr = new InputStreamReader(stderr); BufferedReader br = new BufferedReader(isr); String line; //打印 sb,获取更多信息。如bitrate、width、heigt StringBuffer sb = new StringBuffer(); while ((line = br.readLine()) !=null) { sb.append(line); } new File(tmpFile).delete(); System.out.println("video info:\n" + sb); Pattern pattern = Pattern.compile("Duration: (.*?),"); Matcher matcher = pattern.matcher(sb); if (matcher.find()) { String time = matcher.group(1); calcTime(time); } pattern = Pattern.compile("w:\\d+ h:\\d+"); matcher = pattern.matcher(sb); if (matcher.find()) { String wh = matcher.group(); //w:100 h:100 String[] strs = wh.split("\\s+"); if(strs !=null && strs.length == 2) { width = Integer.parseInt(strs[0].split(":")[1]); heigt = Integer.parseInt(strs[1].split(":")[1]); } } process.waitFor(); if(br != null) br.close(); if(isr != null) isr.close(); if(stderr !=null) stderr.close(); } private void calcTime(String timeStr) { String[] parts = timeStr.split(":"); hours = Integer.parseInt(parts[0]); minutes = Integer.parseInt(parts[1]); seconds = Float.parseFloat(parts[2]); } public String getFfmpegApp() { return ffmpegApp; } public void setFfmpegApp(String ffmpegApp) { this.ffmpegApp = ffmpegApp; } public int getHours() { return hours; } public void setHours(int hours) { this.hours = hours; } public int getMinutes() { return minutes; } public void setMinutes(int minutes) { this.minutes = minutes; } public float getSeconds() { return seconds; } public void setSeconds(float seconds) { this.seconds = seconds; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeigt() { return heigt; } public void setHeigt(int heigt) { this.heigt = heigt; } // public static void main(String[] args)// {// VideoInfo videoInfo = new VideoInfo("/data/qinyi/ffmpeg/bin/ffmpeg.exe");// try// {// videoInfo.getInfo("d:/aa.mp4");// System.out.println(videoInfo);// } catch (Exception e)// {// e.printStackTrace();// }// } }
2.获取指定时分秒及保存图片的大小设置
package com.qs.util.videoUtil;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.BufferedReader; /** * @author reyo * FFMPEG homepage http://ffmpeg.org/about.html * By Google Get first and last thumb of a video using Java and FFMpeg * From http://www.codereye.com/2010/05/get-first-and-last-thumb-of-video-using.html */ public class VideoThumbTaker{ protected StringffmpegApp; public VideoThumbTaker(String ffmpegApp) { this.ffmpegApp = ffmpegApp; } @SuppressWarnings("unused") /**** * 获取指定时间内的图片 * @param videoFilename:视频路径 * @param thumbFilename:图片保存路径 * @param width:图片长 * @param height:图片宽 * @param hour:指定时 * @param min:指定分 * @param sec:指定秒 * @throws IOException * @throws InterruptedException */ public void getThumb(String videoFilename, String thumbFilename,int width, int height,int hour,int min,float sec)throws IOException, InterruptedException { ProcessBuilder processBuilder = new ProcessBuilder(ffmpegApp,"-y", "-i", videoFilename, "-vframes", "1", "-ss", hour + ":" + min + ":" + sec, "-f", "mjpeg", "-s", width + "*" + height, "-an", thumbFilename); Process process = processBuilder.start(); InputStream stderr = process.getErrorStream(); InputStreamReader isr = new InputStreamReader(stderr); BufferedReader br = new BufferedReader(isr); String line; while ((line = br.readLine()) !=null) ; process.waitFor(); if(br != null) br.close(); if(isr != null) isr.close(); if(stderr !=null) stderr.close(); } // public static void main(String[] args)// {// VideoThumbTaker videoThumbTaker = new VideoThumbTaker("D:\\ffmpeg\\bin\\ffmpeg.exe");// try// {// videoThumbTaker.getThumb("d:/aa.mp4", "d:\\first3.png", 204, 140, 0, 0, 0);// System.out.println("over");// } catch (Exception e)// {// e.printStackTrace();// }// }}
3.测试类
package com.qs.util.videoUtil;import java.io.IOException; /*** * * 得到第一秒(也是第一帧)图片 */public class VideoFirstThumbTakerextends VideoThumbTaker{ public VideoFirstThumbTaker(String ffmpegApp) { super(ffmpegApp); } public void getThumb(String videoFilename, String thumbFilename,int width, int height)throws IOException, InterruptedException { super.getThumb(videoFilename, thumbFilename, width, height, 0, 0, 1); }}
4.测试类
/** * 得到最后一秒(也是最后一帧)图片 */public class VideoLastThumbTakerextends VideoThumbTaker{ public VideoLastThumbTaker(String ffmpegApp) { super(ffmpegApp); } public void getThumb(String videoFilename, String thumbFilename,int width, int height) throws IOException, InterruptedException { VideoInfo videoInfo = new VideoInfo(ffmpegApp); videoInfo.getInfo(videoFilename); super.getThumb(videoFilename, thumbFilename, width, height, videoInfo.getHours(), videoInfo.getMinutes(), videoInfo.getSeconds() - 0.2f); }}
注意:windows下可以直接下载ffmpeg.exe 来指定其路径操作视频.而在linux下不支持exe可执行文件,需要单独安装ffmpeg 及其所需的插件.具体方法如下:
Linux下安装ffmpeg
ffmpeg是一个很强大的音视频处理工具,官网是:http://ffmpeg.org/ 官网介绍ffmpeg是:一个完整的、跨平台的解决方案,可以记录、转换和传输音频和视频。ffmpeg既可以播放视频,也提供命令行工具来处理视频,另外还有强大的视频处理库用于开发,下面是以Linux为例介绍ffmpeg的安装流程的简单的命令行对视频进行转码操作,是ffmpeg中最最简单的入门内容.
首先去官网下载源码包,这里下载的是最新的ffmpeg-3.3.1.tar.bz2,下载之后上传至Linux准备安装,首先解压安装包:
tar -xjvf ffmpeg-3.3.1.tar.bz2
cd ffmpeg-3.3.1/
如果现在直接执行configure配置的话,可能会报如下的错误:
错误的意思是 yasm/nasm 包不存在或者很旧,可以使用--disable-yasm禁用这个选项编译,yasm是一款汇编器,并且是完全重写了nasm的汇编环境,接收nasm和gas语法,支持x86和amd64指令集,所以这里安装一下yasm即可,下载地址是:http://yasm.tortall.net/Download.html 进入后下载1.3.0的源码包,执行下面命令安装:
tar -xvzf yasm-1.3.0.tar.gz
cd yasm-1.3.0/
./configure
Make
make install
编译参数都是默认的,直接安装到系统中即可,安装成功之后继续回到ffmpeg解压后的目录,执行下面命令编译并安装:
./configure --enable-shared --prefix=/monchickey/ffmpeg
Make
make install
编译过程有点长,耐心等待完成之后执行 cd /monchickey/ffmpeg/ 进入安装目录,查看一下发现有bin,include,lib,share这4个目录,其中bin是ffmpeg主程序二进制目录,include是C/C++头文件目录,lib是编译好的库文件目录,share是文档目录,然后进入bin目录,执行 ./ffmpeg -version 查看当前版本的详细信息,默认情况下一般会报libavdevice.so.57: cannot open shared object file: No such file or directory,原因是lib目录未加载到链接到系统库中,系统ld目录列表在/etc/ld.so.conf中,打开文件会发现,里面引用了/etc/ld.so.conf.d/下面所有的.conf文件,比如mariadb-x86_64.conf我们只需要创建一个文件并写入lib路径即可,执行命令: vim /etc/ld.so.conf.d/ffmpeg.conf 然后添加一行内容: /monchickey/ffmpeg/lib 之后保存并退出,然后执行 ldconfig 使配置生效,现在再次执行 ./ffmpeg -version 显示就正常了
然后可以根据需要将bin目录添加至环境变量中以保证任何时候都能使用ffmpeg命令,下面测试一下对视频进行转码:
首先由一个avi格式的视频文件,大小是37M,现在使用ffmpeg转换为mp4格式,执行下面命令:
ffmpeg -i test.avi out.mp4
确认之后,看到屏幕滚动开始处理,大约半分钟之后视频就转换完毕了,转换后mp4视频大小是17M,具体可以下载下来看一下
现在ffmpeg安装和最简单的命令行视频转换就完成了,实际上ffmpeg命令行工具可以有很多参数不用编程就可以实现强大的功能
注明:本文内容并非原创,为转载整合,方便查阅使用
- java用ffmpeg插件来捕获视频第一帧
- java用ffmpeg来截图
- Java 视频捕获(JMF)
- java捕获音视频
- 利用ffmpeg来合并视频
- ffmpeg来进行视频编码
- 通过 ffmpeg 获取视频第一帧(指定时间)图片
- 截取视频第一帧——使用ffmpeg
- 通过 ffmpeg 获取视频第一帧(指定时间)图片
- ffmpeg批量获取视频第一帧shell脚本
- GetBitmapBits捕获视频帧
- JAVA ffmpeg 视频处理
- Atitit java opencv 捕获视频
- ffmpeg视频转码和获取视频第一帧shell脚本
- 第一个ffmpeg程序,实现播放视频
- 使用ffmpeg捕获USB外部摄像头视频流
- 使用ffmpeg捕获USB外部摄像头视频流实时播放
- 使用ffmpeg捕获USB外部摄像头视频流
- leetcode 306. Additive Number 一个典型的DFS深度优先遍地问题
- Ubuntu环境下安装GPU版本的caffe
- bzoj 1056 && 1862: [Zjoi2006]GameZ游戏排名系统(Treap+Hash)
- android 模拟window运行环境
- RocketMQ与Spring集成
- java用ffmpeg插件来捕获视频第一帧
- 【牛客网】直通bat-面试算法精品课_第2章 排序 2.13 小范围排序练习题(JAVA版)
- Spring MVC环境下用poi技术实现Excel的导入导出
- 顺序表应用4-2:元素位置互换之逆置算法(数据改进)
- 初窥javaScrit权威指南,第三章类型、值和变量(2)
- docker常用命令 解析
- BZOJ 3668:位运算
- xbanner
- Web dynpro for ABAP ALV 相关知识