java 上传视频在后台怎么先生成缩略图在上传到ftp

现在已经能上传视频到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;
/**

  • 视频截图工具
  • @author zhushoucheng@witgo.cn
  • @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());
    }

    /**

    • 使用InputStream构造视频对象,并调用随机截图方法
    • @param is
    • @param randomSize
    • @return
    • @throws Exception */ public static List randomGrabberFFmpegImage(InputStream is, int randomSize) throws Exception { FFmpegFrameGrabber ff = new FFmpegFrameGrabber(is); return randomGrabberFFmpegImage(ff, randomSize); }

    /**

    • 用户文件本地地址构造视频对象,并调用随机截图方法
    • @param filePath
    • @param randomSize
    • @return
    • @throws Exception */ public static List randomGrabberFFmpegImage(String filePath, int randomSize) throws Exception { FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath); return randomGrabberFFmpegImage(ff, randomSize); }

    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

我公司也在用的,确定可用的。注释写的还算清楚。