使用ffmpeg进行视频截图转码

ffmpeg官网 http://ffmpeg.org/

window安装

下载

访问 https://ffmpeg.zeranoe.com/builds/ 下载windows安装包

使用ffmpeg进行视频截图转码_第1张图片

解压

使用ffmpeg进行视频截图转码_第2张图片

添加到环境变量

使用ffmpeg进行视频截图转码_第3张图片

验证安装

输入ffmpeg -version命令查看ffmpeg版本,输出版本号说明安装成功

使用ffmpeg进行视频截图转码_第4张图片

Linux安装

操作系统:CentOS7 ffmpeg版本:3.4.1

安装

先访问ffmpeg官网下载linux安装包 http://ffmpeg.org/download.html ,这里我下载的是官方已经编译过的版本,别问我为啥不自己编译,因为我自己编译耗费了好久,出现了n个问题…

使用ffmpeg进行视频截图转码_第5张图片

使用ffmpeg进行视频截图转码_第6张图片

官方编译过的启动很简单,执行命令./ffmpeg就可以了

下载完压缩包后,解压,进入ffmpeg目录(解压tar.xz文件:先 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar 然后,再用 tar xvf xxx.tar来解包。)

ffmpeg 目录

使用ffmpeg进行视频截图转码_第7张图片

执行./ffmpeg -version查看版本信息,可以看到编码库已经编译好了,不用自己再下载安装libx264等编码库了,省了不少时间

# ./ffmpeg -version 

ffmpeg version 3.4.1-static https://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 6.4.0 (Debian 6.4.0-10) 20171112
configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg
libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100

设置环境变量

同windows一样,在PATH添加环境变量:
# vi /etc/profile
PATH=$PATH:/usr/local/ffmpeg
export PATH
保存退出

# source /etc/profile   设置生效

通用参数

-L              显示许可证
-h              帮助
-version        显示版本
-fromats        显示可用的格式,编解码的,协议的...
-f fmt          强制输入或输出文件格式。格式通常是自动检测输入文件,并从输出文件的文件扩展名中猜测出来的,所以在大多数情况下这个选项是不需要的。
-i url          输入文件的地址
-y              覆盖文件而不询问
-n              不要覆盖输出文件,如果指定的输出文件已经存在,立即退出
-stream_loop number 设置输入流应循环的次数。循环0意味着没有循环,循环-1意味着无限循环
-c [:stream_specifier] | -codec [:stream_specifier] 选择一个编码器(当在输出文件之前使用)或解码器(当在输入文件之前使用时)用于一个或多个流
-t duration     当用作输入选项(之前-i)时,限制从输入文件中读取的数据的持续时间
-fs limit_size  设置文件大小限制,以字节表示。超出限制后不会写入更多字节。输出文件的大小稍微大于请求的文件大小
image2          截图
copy            复制
-vcodec         等同于-codec:v
-r              设置帧率
-ab             设置比特率
-vol            音量提高到200%
-ss             开始切割的时间

...
更多参数请参考官网 http://ffmpeg.org/ffmpeg.html

举例

复制本地视频并转换格式为MP4
ffmpeg -i 本地视频 -y -c:v copy 转换视频.mp4

转换本地视频为MP4格式
ffmpeg -i 本地视频 -y -c:v libx264 -strict -2 转换视频.mp4

截取视频1s处的一张截图
ffmpeg -i 本地视频 -y -r 1 -t 1 图片名.jpg

截取指定时间点
ffmpeg -i 本地视频 -y -ss 00:00:15 -t 0.001 图片名.jpg

截取视频1s的多张截图并按照3位数命名
ffmpeg -i 本地视频 -y -t 1 图片名-%03d.jpg

可以设置开始的时间,和你想要截取的时间。 
ffmpeg -i 本地视频 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg 
-ss 表示开始时间 
-t 表示共要多少时间。 
如此,ffmpeg会从视频的第20s时间开始,往下10s,即20~30s这10秒钟之间,每隔1s就抓一帧,总共会抓10帧。

java调用

package user;

import org.joda.time.DateTime;
import org.junit.Test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class TestVideo {
    @Test
    public void getVideoThumbnail() throws IOException {
        //ffmpeg -i xxx.mp4 -y -f image2 -t 0.001 -s 125x125 xxx.jpg
        List cmd = new java.util.ArrayList<>();
        // 视频提取工具的位置
        cmd.add("D://ffmpeg/bin/ffmpeg");
        cmd.add("-i");
        cmd.add("d://bb.mp4");
        cmd.add("-y");
        cmd.add("-f");
        cmd.add("image2");
        cmd.add("-t");
        cmd.add("0.002");
        cmd.add("d://aa.png");
        ProcessBuilder builder = new ProcessBuilder();
        builder.command(cmd);
        builder.redirectErrorStream(true);
        builder.start();
    }

    @Test
    public void getVideoTranscoding() throws IOException, InterruptedException {
        String sourcePath = "d://a.mp4";
        long startTime = System.currentTimeMillis();
        List cmd = new ArrayList<>();
        // 视频提取工具的位置
        cmd.add("D://ffmpeg/bin/ffmpeg");
        cmd.add("-i");
        cmd.add(sourcePath);
        cmd.add("-c:v");
        cmd.add("libx264");
        cmd.add("-strict");
        cmd.add("-2");
        cmd.add("d://转换1-" + DateTime.now().getMillis() + ".mp4");
        ProcessBuilder builder = new ProcessBuilder();
        builder.command(cmd);
        builder.redirectErrorStream(true);
        Process process = builder.start();
        InputStream in = process.getInputStream();
        outStream(in);
        System.out.println("耗时:" + (System.currentTimeMillis() - startTime) / 1000 + "秒");

        startTime = System.currentTimeMillis();
        cmd.clear();
        // 视频提取工具的位置
        cmd.add("D://ffmpeg/bin/ffmpeg");
        cmd.add("-i");
        cmd.add(sourcePath);
        cmd.add("-c:v");
        cmd.add("copy");
        cmd.add("-f");
        cmd.add("mp4");
        cmd.add("d://转换2-" + DateTime.now().getMillis() + ".mp4");
        builder = new ProcessBuilder();
        builder.command(cmd);
        builder.redirectErrorStream(true);
        process = builder.start();
        in = process.getInputStream();
        outStream(in);
        System.out.println("耗时:" + (System.currentTimeMillis() - startTime) / 1000 + "秒");

        startTime = System.currentTimeMillis();
        cmd.clear();
        // 视频提取工具的位置
        cmd.add("D://ffmpeg/bin/ffmpeg");
        cmd.add("-i");
        cmd.add(sourcePath);
        cmd.add("-y");
        cmd.add("-r");
        cmd.add("1");
        cmd.add("-f");
        cmd.add("image2");
        cmd.add("-t");
        cmd.add("0.002");
        cmd.add("d://截图-" + DateTime.now().getMillis() + ".jpg");
        builder = new ProcessBuilder();
        builder.command(cmd);
        builder.redirectErrorStream(true);
        builder.start();
        System.out.println("耗时:" + (System.currentTimeMillis() - startTime) / 1000 + "秒");
        System.out.println("转换成功");
    }

    private void outStream(InputStream p) {
        // 用一个读输出流类去读
        BufferedReader br = new BufferedReader(new InputStreamReader(p));
        String line;
        // 逐行读取输出到控制台
        try {
            while ((line = br.readLine()) != null) {
//                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(ffmpeg)