FFmpeg截图以及生成缩略图

介绍:FFmpeg是用于录制、转换和流化音频和视频的完整解决方案,一套领先的音/视频编解码类库。官方正式版ffmpeg不支持rmvb和rm格式. 不过有很多解决方法
FFmpeg的官方网址是 http://ffmpeg.mplayerhq.hu/
中文Wiki是 http://www.ffmpeg.com.cn/ ,资料很多。

示例1:
截取视频test.asf的第0.001秒处的一张352x240尺寸大小的,格式为jpg的图片:
ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg

示例2:
把视频的前30帧转换成一个Animated Gif :
ffmpeg -i test.asf -vframes 30 -y -f gif a.gif

示例3
在视频的第8.01秒处截取 320*240 的缩略图
ffmpeg -i test.flv -y -f mjpeg -ss 3 -t 0.001 -s 320x240 test.jpg

其中:
source:是原始文件的名字,可以是mov,mpeg,avi,wmv各类格式,ffmpeg基本都支持。
-s wxh: 指定视频的宽和高
-b : 设定视频的比特率
-aspect: 保持视频的比率。如4:3或者16:9
-y : 如果目标文件存在时,直接覆盖原有的目标文件。
-f : 指定转换的文件格式,这里是flv格式。(其实如果不指定文件格式,ffmpeg也会按文件的后缀名来进行转换)。
dest: 转换的目标文件名字,并不一定需要是flv,可以是mov,mpeg以及其他的常用格式。
参数说明:
-L license
-h 帮助
-fromats 显示可用的格式,编解码的,协议的
-f fmt 强迫采用格式fmt
-I filename 输入文件
-y 覆盖输出文件
-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
s wxh: 指定视频的宽和高


示例3:是针对flv格式的视频获得指定处的缩略图,记住 -f强制转换的格式是mjpeg因为我要获得.jpg的缩略图,网上有很多写成文章都是写成ffmpeg -i test.flv -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg 这个是错误,不可能输出.

java中使用FFmpeg截图和生成缩略图的代码:若想使用FFmpeg需要先在电脑上安装他的Client,网上很多安装教程可以去查。生成截图的相关类基本都是系统类库中的,所以不需要引入jar包,可复制后直接使用

package com.luntek.util;

import java.awt.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;


/**
 * @author Czw
 * @description: 通过ffmpeg截取视频图片
 * @date 2019/3/26
 */
public class FFmpegUtil {
    //FFmpeg安装时的bin目录下的指令路径
    private String ffmpegEXE;

    public FFmpegUtil(String ffmpegEXE) {
        this.ffmpegEXE = ffmpegEXE;
    }

    /**
     * -s wxh: 指定视频的宽和高
     * -b : 设定视频的比特率
     * -aspect: 保持视频的比率。如4:3或者16:9
     * -y : 如果目标文件存在时,直接覆盖原有的目标文件。
     * -f : 指定转换的文件格式,这里是flv格式。(其实如果不指定文件格式,ffmpeg也会按文件的后缀名来进行转换)。 
     * 拼接截图指令截图
     * @param videoInputPath 视频路径
     * @param coverOutputPath 截取的图片存放路径
     * @throws Exception
     */
    public void screenshotInstruction(String videoInputPath, String coverOutputPath) throws Exception {
        //ffmpeg  -i 划片.mov  -vframes 1  output.jpg
        List<String> command = new ArrayList<>();
        command.add(ffmpegEXE);
        command.add("-i");
        command.add(videoInputPath);
        command.add("-vframes");
        command.add("1");
        command.add(coverOutputPath);
        ProcessBuilder builder = new ProcessBuilder(command);
        builder.start();
    }

    /**
     * 拼接截取缩略图指令
     * @param videoInputPath 视频路径
     * @param coverOutputPath 截取的图片存放路径
     * @throws Exception
     */
    public void thumbnailInstruction(String videoInputPath, String coverOutputPath) throws Exception {
        //ffmpeg -i test.mov -y -f mjpeg -t 1.001 -s 100*100 a.jpg
        List<String> command = new ArrayList<>();
        command.add(ffmpegEXE);
        command.add("-i");
        command.add(videoInputPath);
        command.add("-y");
        command.add("-f");
        command.add("mjpeg");
        command.add("-t");
        command.add("1.001");
        command.add("-s");
        command.add("100*100");
        command.add(coverOutputPath);
        ProcessBuilder builder = new ProcessBuilder(command);
        builder.start();
    }

    public static void main(String[] args) {
    	//括号中的参数为电脑安装FFmpeg的bin目录下的ffmpeg.exe指令目录
        FFmpegUtil cover = new FFmpegUtil("D:\\FFmped\\ffmpeg-20180702-3c4af57-win64-shared\\bin\\ffmpeg.exe");

        try {
            //截图
            cover.screenshotInstruction("http://47.96.88.182/group1/M00/00/00/rBDOzlzHvsyAIh3dAMaIVYiI-pg2381742",
                   "C:\\Users\\Administrator\\Desktop\\test.jpg");

            //生成缩略图
            cover.thumbnailInstruction("http://47.96.88.182/group1/M00/00/00/rBDOzlzHvsyAIh3dAMaIVYiI-pg2381742",
            "C:\\Users\\Administrator\\Desktop\\test.jpg");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

启动:
在这里插入图片描述
生成的图片:
在这里插入图片描述
引用此文部分内容,鸣谢,哈哈哈~:https://blog.csdn.net/wwwyuanliang10000/article/details/70799127
余生还长,切勿惆怅

猜你喜欢

转载自blog.csdn.net/qq_42910468/article/details/89737048
今日推荐