上一篇博文详细讲解了【FFmpeg命令】使用x264库进行图像视频(批量)压缩编码,本文介绍FFmpeg里x265库的命令使用,以实现图像视频(批量)压缩编码。
1. 了解libx265库
与用libx264编码的H.264视频相比,libx265编码器可以节省约25-50%的比特率,同时保持相同的视觉质量。这些优势在1080p以上的分辨率下最为明显。
最新版的FFmpeg Build
已集成编译了libx265
,可通过以下命令查看自己的FFmpeg版本以及是否支持x265编码:
ffmpeg -version
我的版本是git-2020-08-09-6e951d0
。配置有–enable-libx265
说明该版本是支持x265编码的。
此外,还可以通过以下命令查看版本所支持的编码器:
ffmpeg -encoders
据显示,FFmpeg支持的编码器非常多,其中包括x264和x265库。
点此可前往官网下载最新版本,还可参考此博文安装配置FFmpeg。
前往官方文档http://ffmpeg.org/ffmpeg-all.html#libx265,有关于libx265的配置说明,其列出了非常多的配置选项。
其中,有一个配置选项为x265-params
,用于以:
为分隔符,key=value
的列表组设置x265的配置参数。
x265-params
- Set x265 options using a list of key=value couples separated by “:”. See x265 --help for a list of options.
For example to specify libx265 encoding options with -x265-params(举个栗子):
ffmpeg -i input -c:v libx265 -x265-params crf=26:psy-rd=1 output.mp4
更多libx265使用说明还可以参看H.265/HEVC Video Encoding Guide.
2. 图像x265压缩编码
一般情况下, x265 的qp量化比例为0~51。qp越大,压缩越厉害,失真越严重,失去的信息越多,画面也就越模糊。
2.1 单命令
当前目录下有图像input.jpg
,以预设中等,qp47将其进行x265压缩编码,输出为output.jpg
.
ffmpeg -i input.jpg -c:v libx265 -x265-params qp=47 output.mkv
ffmpeg -i output.mkv -r 1 -f image2 output.jpg
-i
:指定输入文件;
-c:v
:指定视频编码库为libx265
;
-preset
:指定预设,若选择medium
,不加也没事;
-qp
:指定量化参数为47
.
第一条命令:将图像按指定qp进行x265编码压缩成mkv格式。
-i
: 指定输入文件;
-r
: 指定帧数 1
;
-f
: 指定格式化的格式为image2
;
image2
后面跟着的是输出文件名。
第二条命令:将视频按指定帧数分割成图片。
为什么分为两条命令?
这里有个小小疑问,在x264压缩编码已经做了必要的说明,这里不重复说了。
结果新生成两个文件:
原图(上)与qp47图片对比:
最右边那棵树已经模糊得看不见了。
2.2 裁剪预处理
有些朋友可能会在执行第一条命令的时候出现Conversion failed
:
Press [q] to stop, [?] for help
x265 [info]: HEVC encoder version 3.4+2-73ca1d7be377
x265 [info]: build info [Windows][GCC 10.2.1][64 bit] 8bit+10bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
x265 [error]: Picture width must be an integer multiple of the specified chroma subsampling
[libx265 @ 0000020723532980] Cannot open libx265 encoder.
Error initializing output stream 0:0 – Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!
原因可能在于输入图像的宽或高不符合2的倍数。
若出现这种情况,莫慌,可参考这篇博文进行图像(批量)resize处理。
2.3 批量压缩编码
对于一组resize后的图像,我们想要分别得到qp21~51的压缩结果。图像很多,如何批量处理?
x265_VOC2007文件内容如下:
label_resize2文件内容如下:
mkv和jpg文件内容如下:
目标:对于每一个qp文件夹,生成对应qp的mkv或jpg文件,输入对象包括label中的全部文件。
话不多说,上码。
import os
labelFile_path=r"F:\SDDR\datasets\x265_VOC2007\label_resize2"
mkvFile_path=r"F:\SDDR\datasets\x265_VOC2007\mkv"
x265File_path=r"F:\SDDR\datasets\x265_VOC2007\jpg"
mkvFile_list=os.listdir(mkvFile_path)
for mkvFile in mkvFile_list: #qpxx
label_list=os.listdir(labelFile_path)
for label in label_list: #xxx.jpg
'''
jpg to mkv with qpxx
'''
os.chdir(labelFile_path) # .../JPEGImages/
cmd_jpg_to_mkv="ffmpeg -i "+label+" -c:v libx265 -x265-params qp="\
+mkvFile[2:]+" "+mkvFile_path+"/"+mkvFile+"/"+\
label[:len(label)-4]+".mkv"
# print(cmd_jpg_to_mkv)
os.system(cmd_jpg_to_mkv)
'''
mkv to jpg
'''
os.chdir(mkvFile_path+"/"+mkvFile) #.../x265_VOC2007/
cmd_mkv_to_jpg = "ffmpeg -i "+label[:len(label)-4]+".mkv -r 1 \
-f image2 "+x265File_path+"/"+mkvFile+"/"+label
# print(cmd_mkv_to_jpg)
os.system(cmd_mkv_to_jpg)
3. 视频x265压缩编码
视频与图像类似,参数一样,只是视频允许“一步到位”。假设当前目录下有MP4文件input.mp4
.
3.1 单命令
ffmpeg -i input.mp4 -c:v libx265 -x265-params qp=51 output.mp4
视频原帧(上)和结果帧对比:
失真还是很明显的。
3.2 批量压缩编码
文件创建如下:
代码:
import os
labelFile_path=r"F:\SDDR\datasets\surveillance\label"
x265File_path=r"F:\SDDR\datasets\surveillance\x265"
os.chdir(labelFile_path)
x265File_list=os.listdir(x265File_path)
for x265File in x265File_list: #qpxx
labelFile_list=os.listdir(labelFile_path)
for label in labelFile_list: #xxx.mp5
cmd_x265="ffmpeg -i "+label+" -c:v libx265 -x265-params qp="\
+x265File[2:]+" "+x265File_path+"/"+x265File+"/"+label
os.system(cmd_x265)
注:以上代码需要根据自己本地情况修改路径,并注意文件夹创建方式及命名方式
更多命令查看官方Documentation;
更多libx265使用说明还可以参看H.265/HEVC Video Encoding Guide.