您的位置:首页 > 其它

使用ffmpeg进行视频截图转码

2018-01-26 18:10 579 查看
ffmpeg官网 http://ffmpeg.org/

window安装

下载

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



解压



添加到环境变量



验证安装

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



Linux安装

操作系统:CentOS7 ffmpeg版本:3.4.1

安装

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





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

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

ffmpeg 目录



执行
./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[/code] 

举例

复制本地视频并转换格式为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<String> 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<String> 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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: