最近电脑硬盘空间紧张,舍不得删掉珍贵的高清视频,要么加硬盘,要么想办法压缩空间。这里分享后者的一种解决方案。 实践了一番,最终用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

参考