ffmpeg视频相关

ffmpeg安装

ffmpeg官方下载地址

windows安装

下载对应位数的压缩包,解压如下

ffmpeg安装文件

配置环境变量

ffmpeg安装配置环境变量

linux安装

https://ffmpeg.org/releases/ffmpeg-4.0.2.tar.bz2

https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

解压

1
2
tar -xjvf ffmpeg-4.0.2.tar.bz2
tar -xvzf yasm-1.3.0.tar.gz

先安装yasm

1
2
3
4
cd yasm-1.3.0/ 
./configure
make
make install

如果未安装gcc,执行如下指令安装gcc

1
yum install gcc-c++

安装ffmpeg

不指定prefix,可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc。其它的资源文件放在/usr/local/share(指定安装位置)make编译过程有点长,耐心等待。

1
2
3
4
cd ffmpeg-4.0.2
./configure --enable-shared --prefix=/home/ffmpeg
make
make install

添加软链

1
cp /home/ffmpeg/bin/ffmpeg /usr/local/bin/ffmpeg

查看版本,检查是否安装正确

1
ffmpeg -version

如果报如下异常:

ffmpeg: error while loading shared libraries: libavdevice.so.58: cannot open shared object file: No such file or directory

添加文件,并编辑写入: /home/ffmpeg/lib
执行命令: vim /etc/ld.so.conf.d/ffmpeg.conf

完成后执行如下,使配置生效。重新查看版本,安装完成

1
/sbin/ldconfig   或者直接运行 ldconfig

视频流按时间截取mp4

1
2
3
ffmpeg -i 视频地址 -vcodec copy -acodec copy -ss 开始时间 -to 结束时间 输出文件地址 -y
如:
ffmpeg -i rtmp://58.200.131.2:1935/livetv/hunantv -vcodec copy -acodec copy -ss 00:00:00 -to 00:00:10 F:\cutout2.mp4 -y

参数详解

参数 描述
-i 输入您要处理的视频文件路径
视频地址 可以是视频文件,也可以是视频流
-vcodec copy 表示使用跟原视频一样的视频编解码器
-acodec copy 表示使用跟原视频一样的音频编解码器
-ss 开始时间 从某个时间开始
-to 结束时间 从某个时间结束
-y 表示如果输出文件已存在则覆盖

海康视频需要截取为ts文件

1
ffmpeg -i "rtsp://admin:密码@192.168.0.222/h264/ch1/main/av_stream?videoCodecType=H.264" -vcodec copy -acodec copy -ss 00:00:00 -to 00:00:10 F:\test.ts -y

利用ffmpeg将ts文件转为mp4

1
ffmpeg -y -i test.ts -c:v libx264 -c:a copy -bsf:a aac_adtstoasc output.mp4

截取图片

1280x720为图片的分辨率

1
ffmpeg -i rtmp://58.200.131.2:1935/livetv/hunantv -vframes 1 -y -f image2 -t 1 -s 1280x720 test.jpg

java调用

1
2
Process process = Runtime.getRuntime().exec(command);//执行命令
process.waitFor();

问题:如果输入的视频地址掉线或者网络不畅,java执行后会导致线程死锁,所以使用如下方法,增加一个线程来设置超时时间。

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
26
27
28
29
30
31
32
33
34
35
36
public static int executeCommand(final String command, final long timeout) throws IOException, InterruptedException, TimeoutException {
Process process = Runtime.getRuntime().exec(command);
Worker worker = new Worker(process);
worker.start();
try {
worker.join(timeout);
if (worker.exit != null){
return worker.exit;
} else{
throw new TimeoutException();
}
} catch (InterruptedException ex) {
worker.interrupt();
Thread.currentThread().interrupt();
throw ex;
} finally {
process.destroy();
}
}

private static class Worker extends Thread {
private final Process process;
private Integer exit;

private Worker(Process process) {
this.process = process;
}

public void run() {
try {
exit = process.waitFor();
} catch (InterruptedException ignore) {
return;
}
}
}
文章作者: 柯熠
文章链接: https://smallkserver.github.io/2019/09/06/ffmpeg视频操作/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Smallkserver
打赏
  • 微信
  • 支付宝

评论