现在已经能上传视频到ftp了 可是不知道怎么生成缩略图,我想截取第一帧当做在前台展示的视频的图片,请问怎么用代码在后台上传方法内形成视频的缩略图?
用ffmpeg
http://blog.csdn.net/birthmarkqiqi/article/details/58083033
有哪位大神能帮帮小弟啊 很着急 我用网上说的ffmpeg了 结果不好使 我们项目是ssh的 我把ffmpeg.exe放在D盘结果没有截取到图片是怎么回事 帮小弟做出来还会额外加分的
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber.Exception;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.OpenCVFrameConverter;
/**
@datetime 2017年1月21日 下午5:00:17
*
*/
public abstract class FrameGrabberKit {
public static void main(String[] args) throws Exception {
// randomGrabberFFmpegImage("e:/ffmpeg/ffmpeg.mp4", "./target", "月赋情长", 10);
byte[] content = FileUtil.readFromUrl("");
InputStream is = new ByteArrayInputStream(content);
List list = randomGrabberFFmpegImage(is, 5);
// List list = randomGrabberFFmpegImage("e://ffmpeg/aa.mp4", 5);
System.out.println(list.size());
}
/**
/**
public static List randomGrabberFFmpegImage(FFmpegFrameGrabber ff, int randomSize) throws Exception {
List imageList = new ArrayList<>();
// 打开视频
ff.start();
// 获取视频旋转信息
String rotate = ff.getVideoMetadata("rotate");
// 视频总帧数
int ffLength = ff.getLengthInFrames();
// 获取随机截取的帧数
List randomGrab = random(ffLength, randomSize);
// 待截取的最大帧数
int maxRandomGrab = randomGrab.get(randomGrab.size() - 1);
Frame f;
int i = 0;
// 遍历所有的帧,如果当前帧数等于待截取的帧数,则保存该帧,否则继续,当超过最大待截取帧数,则结束循环
while (i < ffLength) {
// 获取第i帧图片对象
f = ff.grabImage();
// 当前帧在待截取帧列表中
if (randomGrab.contains(i)) {
// 如果视频存在旋转信息,截图时需要反旋转处理
if(null != rotate && rotate.length() > 1) {
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
IplImage src = converter.convert(f);
f = converter.convert(rotate(src, Integer.valueOf(rotate)));
}
doExecuteFrame(f, imageList);
}
if (i >= maxRandomGrab) {
break;
}
i++;
}
// 关闭视频
ff.stop();
return imageList;
}
/** 截取视频这一帧 */
@SuppressWarnings("resource")
public static BufferedImage grabberFFmpegImage(InputStream is) {
FFmpegFrameGrabber ff = null;
try {
ff = new FFmpegFrameGrabber(is);
// 打开视频
ff.start();
// 获取视频旋转信息
String rotate = ff.getVideoMetadata("rotate");
Frame f = ff.grabImage();
// 如果视频存在旋转信息,截图时需要反旋转处理
if(null != rotate && rotate.length() > 1) {
OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();
IplImage src = converter.convert(f);
f = converter.convert(rotate(src, Integer.valueOf(rotate)));
}
if (null == f || null == f.image) {
return null;
}
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bi = converter.getBufferedImage(f);
return bi;
} catch (Exception e) {
e.printStackTrace();
} finally {
if(null != ff) {
try {
ff.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return null;
}
/** 图片旋转处理 */
public static IplImage rotate(IplImage src, int rotate) {
IplImage img = IplImage.create(src.height(), src.width(), src.depth(), src.nChannels());
opencv_core.cvTranspose(src, img);
opencv_core.cvFlip(img, img, rotate);
return img;
}
/** 从Frame中获取BufferedImage对象 */
public static void doExecuteFrame(Frame f, List list) {
if (null == f || null == f.image) {
return;
}
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bi = converter.getBufferedImage(f);
list.add(bi);
}
/** 生成待截取随机帧列表,并按升序排序 */
public static List random(int baseNum, int length) {
List list = new ArrayList<>(length);
while (list.size() < length) {
Integer next = (int) (Math.random() * baseNum);
if (list.contains(next)) {
continue;
}
list.add(next);
}
Collections.sort(list);
return list;
}
}
pom.xml
org.bytedeco
javacv-platform
1.3.1
我公司也在用的,确定可用的。注释写的还算清楚。