FFMPEG 功能很强大,做视频必备的软件。

因为有这个需求,通过 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);
}
}