视频剪辑-ffmpeg下载部署安装

前言

最近项目组有针对视频剪辑的功能需求,主要是通过后台上传的视频文件之后,然后需要根据时间剪辑对应的片段用于在相应的页面显示,之前一直没有针对视频文件处理相应的经验,印象中这个视频处理应该是在客户端进行处理的,类似现在很火的抖音、快手等增加各种剪辑、合并等。在网上一看发现服务端也有对应的解决方案。

类似阿里云的视频剪辑: https://helpcdn.aliyun.com/document_detail/101562.html

七牛: https://developer.qiniu.com/dora/api/1246/audio-and-video-stitching-avconcat

以上这些是需要收费的;后来发现ffmpeg这个剪辑工具也能满足相应的需求;

即在服务器上按照ffmpeg这个功能键,然后通过Java代码去执行相应的命令,检测是否剪辑完即可;

环境准备&安装文件

安装文件下载

打开官网地址,进入下载页:https://ffmpeg.org/download.html#build-linux

选择Linux版本点击进入下载对应的版本,或者直接执行以下命令下载最新版本

1
wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz

安装配置

以下为下载文件:

默认下载是xz结尾的文件,这里需要通过以下命令执行下

1
xz -d ffmpeg-git-amd64-static.tar.xz

然后执行解压命令

1
tar -xvf ffmpeg-git-amd64-static.tar

解压完成后就是上图中的ffmpeg-git-20191202-amd64-static目录,这里说明下ffmpeg它只是一个执行工具,是不需要启动的。个人倒腾了好久以为是要启动它,实际上它就是一个工具,解压然后通过命令执行即可

配置命令全局使用

1
2
3
cd /usr/bin
ln -s /sx/soft/ffmpeg-git-20191202-amd64-static/ffmpeg ffmpeg
ln -s /sx/soft/ffmpeg-git-20191202-amd64-static/ffprobe ffprobe

命令剪辑验证

1
ffmpeg -ss 00:00:00 -t 00:00:10 -i 1050.mp4 -vcodec copy -acodec copy output.mp4

以上通过ffmpeg命令剪辑一个视频文件1050.mp4,从开始00:00:00截取到00:00:10结束,相当于截取这个视频文件的前10秒,最后输出output.mp4文件

1
ffmpeg -i /sx/nfs/upload/video/2019/11/12/4ecff05aacd2488ba13f3888649b2bd6.mp4 -ss 1 -f image2 /sx/nfs/upload/video/2019/11/12/1576054920486.png

裁剪图片,把一个视频剪辑成对应的图片帧集合

Java代码执行ffmpeg命令

Java语言通过Process系统类去执行相应的命令,然后返回对应的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public boolean transfer() {
String command = "ffmpeg -ss 00:00:00 -t 00:00:10 -i /sx/soft/ffmpeg-git-20191202-amd64-static/1050.mp4" +
" -vcodec copy -acodec copy /tmp/"
+ System.currentTimeMillis() +".mp4";
try {
log.info("command = {}" , command);
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(command);
log.info("执行命令");
InputStream stderr = proc.getErrorStream();
log.info("获取input stream");
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
log.info("准备读取数据");
while ((line = br.readLine()) != null) {
System.out.println(line);
}
log.info("完成读取");
} catch (Throwable t) {
t.printStackTrace();
return false;
}
return true;
}

Java服务端视频剪辑整体架构

分享到 评论