ffmpeg使用H265编码压缩视频
最近电脑硬盘空间紧张,舍不得删掉珍贵的高清视频,要么加硬盘,要么想办法压缩空间。这里分享后者的一种解决方案。 实践了一番,最终用H.265重新编码视频来间接实现压缩视频文件,这种方式可以几乎不损失清晰度,压缩效率也是相当的高。
使用封装了ffmpeg的软件完成工作
以Mrctime为例,打开软件直接拖入视频,最上面的菜单中点导出,选择H.265编码。
有两项参数选择,一个是影响清晰度,一个是影响文件大小的,测试了几个参数,结果差距很小,可以直接使用默认的参数。确保CRF20左右比较重要,这项影响了清晰度,18以下肉眼不可以分辨,18-30差距非常小,30以上清晰度不大好,所以选20左右即可。
视频转码速度取决于文件大小、上面的参数配置、机器配置高低,可能会非常慢,耐心等待,闲着没事做的时候挂着就行。
下面是一个转码示例。测试结果很满意,原来文件接近5G,转码后差不多1G,关键是清晰度几乎一样,反正我是看不出来哪个是压缩过的,非常完美。可能别的格式的视频效果不会这么好,因为测试的格式数量还不够多,就以上参数来说,测试过很多视频,压缩掉50%以上的空间是很轻松的。
上面两张截图左边是转码后的,右边是原来的文件,完全看不出来差别。重新编码除了可以节省空间,另外如果想备份到网盘的话,还是有好处的,因为文件大小和消重,自用不错。
其它很多软件也支持H.265压制,如HandBrake等。
直接使用ffmpeg来压缩视频
直接命令行使用ffmpeg。
brew install ffmpeg
ffmpeg -i input.avi -c:v libx265 -crf 20 -c:a copy output.mp4
封装成自己的命令行
可以封装成bash脚本,这里把文件命名为h265:
#!/bin/bash
if [ -n "$1" ];then
if [ -n "$2" ];then
ffmpeg -i $1 -c:v libx265 -crf 20 -c:a copy $2
exit
else
echo "缺少输出文件路径"
exit
fi
else
echo "缺少输入文件路径"
exit
fi
把文件放入$PATH路径中,命令h265就可以使用了,不用记住一堆参数:
h265 input.mp4 output.mp4
相关文档:https://trac.ffmpeg.org/wiki/Encode/H.265
再次警告,视频转码真的特别特别慢,亡命地吃CPU..
ffmpeg附加用法
列举ffmpeg其它常用用法。
视频格式转换
ffmpeg -i input.avi output.mp4
提取音频
ffmpeg -i input.mp4 -vn output.mp3
vn 不包括视频
提取视频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
an 不包括音频
合并音频视频
ffmpeg -y –i input.mp4 –i input.mp3 –vcodec copy –acodec copy output.mp4
y 覆盖输出文件
裁剪视频
ffmpeg -i ABP-108.mp4 -ss 00:11:10 -t 00:19:10 -c copy ABP-108_cut.mp4
ss 开始时间 -t 持续总时长
视频截取成图片
ffmpeg -i test.mp4 -f image2 -ss 00:00:05 -t 00:00:03 -r 10 %5d.jpg
ss 开始时间 -t 持续总时长 去掉时间和帧数参数即可把整个视频转成图片
图片合并成视频
ffmpeg -i %5d.jpg test.mp4
截取视频制作gif
ffmpeg -i ABP-108.mp4 -ss 00:00:00 -t 00:00:10 -s 1289x720 -f gif -r 10 ABP-108.gif
s 设置分辨率 f 指定格式为gif r 每秒多少帧
为视频添加字幕
ffmpeg -i input.mkv -i xxx.srt ouput.mkv
支持mkv,添加字幕重新编码字幕,过程同样缓慢
合并视频
将要合并的视频名称放入文件中,如list.txt内容如下
file 'NTR1.mp4'
file 'NTR2.mp4'
file 'NTR4.mp4'
file 'NTR5.mp4'
file 'NTR6.mp4'
file 'NTR7.mp4'
file 'NTR8.mp4'
文件名必须是单引号括起来,合并命令
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
safe 0 不加这个有时会报错 unsafe file