java获取视频播第一帧
FFMPEG 功能很强大,做视频必备的软件。大家可通过 http://ffmpeg.org/ 了解。Windows版本的软件,可通过 http://ffmpeg.zeranoe.com/builds/ 下载。
因为有这个需求,通过 ffmpeg 获取视频第一帧图片
Google一把,就有了结果。
参考:
1、http://www.codereye.com/2010/05/get-first-and-last-thumb-of-video-using.html
1、VideoInfo.java 获取视频信息。读者可认真研究此方法。
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
* 获取视频的信息
* FFMPEG homepage http://ffmpeg.org/about.html
*/
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("D:\\ffmpeg\\bin\\ffmpeg.exe");
try
{
videoInfo.getInfo("f:/reyo/test.mkv");
System.out.println(videoInfo);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
从此类,可以看出,我把 ffmpeg,解压在了 D:\\ffmpeg\\bin\\ffmpeg.exe 路径下,传入一个视频地址,就可以得出视频信息。
2、VideoThumbTaker.java 获取视频指定播放时间的图片
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 String ffmpegApp; 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("f:/reyo/test.mkv", "C:\\thumbTest.png", 800, 600, 0, 0, 9);
System.out.println("over");
} catch (Exception e)
{
e.printStackTrace();
}
}
}
3、VideoFirstThumbTaker.java 获取第一帧图片
import java.io.IOException; /***
*
* 得到第一秒(也是第一帧)图片
*/
public class VideoFirstThumbTaker extends 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、VideoLastThumbTaker.java 获取最后一帧图片
/**
* 得到最后一秒(也是最后一帧)图片
*/ public class VideoLastThumbTaker extends 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);
}
}
java获取视频播第一帧的更多相关文章
- java获取视频的第一帧
//------------maven配置文件--------------- <dependency> <groupId>org.bytedeco</groupId> ...
- 第五十二篇、 OC获取视频的第一帧图片thumbnailImage
获取视频的第一帧图片 有时候我们拍摄完视频后,希望获取一张图片当作这个视频的介绍,这个图片thumbnailImage可以从视频的第一帧获取到. 我们的思路是先获取视频的URL,然后初始化一个MPMo ...
- PHP获取视频的第一帧与时长
//获得视频文件的缩略图 function getVideoCover($file,$time,$name) { if(empty($time))$time = '1';//默认截取第一秒第一帧 $s ...
- 在Android中如何获取视频的第一帧图片并显示在一个ImageView中
String path = Environment.getExternalStorageDirectory().getPath(); MediaMetadataRetriever media = n ...
- C#:获取视频某一帧的缩略图
读取方式:使用ffmpeg读取,所以需要先下载ffmpeg.网上资源有很多. 原理是通过ffmpeg执行一条命令获取视频某一帧的缩略图. 首先,需要获取视频的帧高度和帧宽度,这样获取的缩略图才不会变形 ...
- java获取当月的第一天和最后一天,获取本周的第一天和最后一天
/** * 获取指定日期所在周的第一天和最后一天,用下划线连接 * @param dataStr * @return * @throws ParseException */ public static ...
- 关于ffmpeg /iis 8.5 服务器下,视频截取第一帧参数配置
ffmpeg 视频截取第一帧参数配置: 网站找了很多资料,但是都不能满足要求,然后自己写下解决过程. 首先看自己PHP 版本,安全选项里面 php5.4 跟php5.6 是不一样的.去除里面的sys ...
- java获取当前月第一天和最后一天,上个月第一天和最后一天
package com.test.packager; import java.text.ParseException; import java.text.SimpleDateFormat; impor ...
- java获取视频缩略图
近期由于在做一个关于视频播放的项目,需要使用程序自动获取视频文件的缩略图,特写此文供其他人参考,有不清楚之楚可以给我留言. 1.使用工具:ffmpeg, 官网下载地址:http://ffmpeg.or ...
随机推荐
- knnMatch
先马克下,回头再看:http://blog.csdn.net/zkl99999/article/details/47950425 http://blog.csdn.net/yangtrees/arti ...
- 20165330《网络对抗技术》Exp0 Kali安装
Kali安装 下载地址 Kali官网 VMware 安装步骤 参考在虚拟机中安装kali linux 安装Kali Linux的镜像和VMware 打开VMware,选择文件-新建虚拟机,出现对话框选 ...
- bnu 10809 聚餐
Lolilu大牛又要请客了~~有些同学呢,是果断要去的,而有些同学呢,只有确定心中的大牛会参加,他才会参加.Lolilu决定请大家去吃金钱豹,因此希望你告诉他一共会有多少人参加,他才知道带多少钱比较合 ...
- Vue开源
Vue开源 - 为移动而生的Vue JS 2组件框架 vonic ★1494 - 快速构建移动端单页应用 eme ★1390 - 优雅的Markdown编辑器 vue-multiselect ★116 ...
- centos 6.x x86 源码安装git-2.3.0
(1) 添加rpmforge源 wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686 ...
- php 会话控制(禁用cookie后session为什么会失效?)
首先说明一点:session不一定必须依赖cookie,只是php默认客户端sessionid基于cookie方式保存. 到此,我想你也应该了解了php默认的session客户端保存方式是基于cook ...
- 使用ApiPost测试接口时需要先登录怎么办?利用Cookie模拟登陆!
ApiPost简介: ApiPost是一个支持团队协作,并可直接生成文档的API调试.管理工具.它支持模拟POST.GET.PUT等常见请求,是后台接口开发者或前端.接口测试人员不可多得的工具 . 下 ...
- 初识MYSQL2
mysql的配置 MySql默认的端口号是3306 默认字符集的设置 在mysql的安装目录,会看到my.ini文件! my.ini文件介绍 01.default-character-set=utf8 ...
- span 居中
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha ====== 把span 升级为块级元素,div 的宽度.然后使用定位,添加 text- ...
- Cmd2001的毒瘤水题题解
怕不是我再不写题解这题就该成没人做也没人会的千古谜题了...... T1: 仔细分析题面,发现相同就是广义SAM上节点相同,相似就是广义SAM上为从根到某个点路径的前缀..直接SAM上跑从根开始,每个 ...