【FFmpeg命令】使用x264库进行图像视频(批量)压缩编码

tech2025-07-28  4

目录

1. 了解libx264库2. 图像x264压缩编码2.1 单命令2.2 裁剪预处理2.3 批量压缩编码 3. 视频x264压缩编码3.1 单命令3.2 批量压缩编码

1. 了解libx264库

从官方文档可以看出,目前FFmpeg已支持非常多的视频编码器解码器,其中编码有包括libx264和libx265。

点击16.11 libx264,libx264rgb。

开头明确了“x264 supports 8- to 10-bit color spaces. The exact bit depth is controlled at x264’s configure time. ”x264支持8到10位的颜色空间。精确的位深度是在x264配置时控制的。

往下拉,我们可以看到FFmpeg提供了非常丰富的配置选项,每一个都附有精简的说明,如:

b (bitrate)

Set bitrate in bits/s. Note that FFmpeg’s b option is expressed in bits/s, while x264’s bitrate is in kilobits/s.

b设置比特率;

me_range (merange)

Maximum range of the motion search in pixels.

me_range设置运动搜索像素的最大范围;

aq-mode (aq-mode)

Set AQ method. Possible values: ‘none (0)’ Disabled.‘variance (1)’ Variance AQ (complexity mask).‘autovariance (2)’ Auto-variance AQ (experimental).

aq-mode设置AQ方式,可能的值有none、variance和autovariance.

其它配置选项还有很多,涉及压缩编码的参数主要有以下几个:

crf (crf)

Set the quality for constant quality mode.

crf(Constant Rate Factor,恒定流量因素),为恒定质量模式设置质量,8-bit x264 量化比例为0~51,10-bit x264的量化比例 为0~63;

qp (qp)

Set constant quantization rate control method parameter.

qp指量化参数,设置恒定的量化率控制方法参数,8-bit x264 量化比例为0~51,10-bit x264的量化比例 为0~63;

preset (preset)

Set the encoding preset

preset设置编码预设。 预设是一系列参数的集合,这个集合能够在编码速度和压缩率之间做出一个权衡。一个编码速度稍慢的预设会提供更高的压缩效率(压缩效率是以文件大小来衡量的)。这就是说,假如你想得到一个指定大小的文件或者采用恒定比特率编码模式,你可以采用一个较慢的预设来获得更好的质量。同样的,对于恒定质量编码模式,你可以通过选择一个较慢的预设轻松地节省比特率。

目前所有的预设按照编码速度降序排列为: ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo,默认缺省预设为medium.

x264-params (N.A.)

Override the x264 configuration using a :-separated list of key=value parameters. This option is functionally the same as the x264opts, but is duplicated for compatibility with the Libav fork.

x264-params组合设置以上提到的各配置选项,使用:分隔的key=value参数列表覆盖x264默认配置。

举一个x264选项配置的例子,For example to specify libx264 encoding options with ffmpeg:

ffmpeg -i INPUT -c:v libx264 -x264-params level=30:bframes=0:weightp=0: cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh: no-fast-pskip=1:subq=6:8x8dct=0:trellis=0 OUTPUT

2. 图像x264压缩编码

8-bit x264 的qp量化比例为0~51,10-bit x264的量化比例 为0~63,软件支持8-bit居多 。

qp越大,压缩越厉害,失真越严重,失去的信息越多,画面越模糊。

2.1 单命令

当前目录下有图像input.jpg,以预设中等,qp47将其进行压缩编码,输出为output.jpg.

ffmpeg -i input.jpg -c:v libx264 -preset medium -qp 47 output.mkv ffmpeg -i output.mkv -r 1 -f image2 output.jpg

-i:指定输入文件; -c:v:指定视频编码库为libx264; -preset:指定预设,若选择medium,不加也没事; -qp:指定量化参数为47. 第一条命令:将图像按指定qp进行x264编码压缩成视频格式。

-i : 指定输入文件; -r : 指定帧数 1; -f : 指定格式化的格式为image2; image2后面跟着的是输出文件名。 第二条命令:将视频按指定帧数分割成图片。

为什么分为两条命令?

一步jpg到jpg,输出的文件似乎有格式问题。(倘若有朋友知道细节,欢迎评论)

而mkv是一种开放标准的自由的容器和文件格式,是一种多媒体封装格式,能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨道。所以其不是一种压缩格式,而是Matroska定义的一种多媒体容器文件。其目标是作为一种统一格式保存常见的电影、电视节目等多媒体内容。

如此一来,该格式一定支持x264转码。之后,再将编码后的视频按帧数、指定格式转码,即能得到压缩后的图像。

三个文件:

原图(上)与qp47图片对比:

2.2 裁剪预处理

有些朋友可能会在执行第一条命令的时候出现Conversion failed:

Press [q] to stop, [?] for help [libx264 @ 0000022bdc862980] width not divisible by 2 (353x500) 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的压缩结果。图像很多,如何批量处理?

x264_VOC2007文件内容如下:

label_resize2文件内容如下:

mkv和jpg文件内容如下:

话不多说,上码。

import os #经过resize的jpg文件路径 labelFile_path=r"F:\SDDR\datasets\x264_VOC2007\label_resize2" #存放mkv文件路径 mkvFile_path=r"F:\SDDR\datasets\x264_VOC2007\mkv" #经x264编码文件路径 x264File_path=r"F:\SDDR\datasets\x264_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 libx264 -preset medium -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) #.../x264_VOC2007/ cmd_mkv_to_jpg = "ffmpeg -i "+label[:len(label)-4]+".mkv -r 1 -f \ image2 "+x264File_path+"/"+mkvFile+"/"+label # print(cmd_mkv_to_jpg) #执行第二条命令 os.system(cmd_mkv_to_jpg)

运行py文件,不同qp文件内就会生成对应的压缩编码结果。

3. 视频x264压缩编码

视频与图像类似,参数一样,只是视频允许“一步到位”。假设当前目录下有MP4文件input.mp4.

3.1 单命令

各配置选项,可以-key value的形式给出:

ffmpeg -i input.mp4 -c:v libx264 -preset medium -qp 47 output.mp4

或者使用:分隔的key=value参数列表:

ffmpeg -i input.mp4 -c:v libx264 -x264-params qp=47 output.mp4

两者都可。

视频原帧(上)和结果帧对比:

3.2 批量压缩编码

文件创建如下:

代码也很容易看懂。

import os labelFile_path=r"F:\SDDR\datasets\surveillance\label" x264File_path=r"F:\SDDR\datasets\surveillance\x264" os.chdir(labelFile_path) x264File_list=os.listdir(x264File_path) for x264File in x264File_list: #qpxx labelFile_list=os.listdir(labelFile_path) for label in labelFile_list: #xxx.mp4 cmd_x264="ffmpeg -i "+label+" -c:v libx264 -preset medium -qp "\ +x264File[2:]+" "+x264File_path+"/"+x264File+"/"+label os.system(cmd_x264)

运行py文件,每个qp文件夹里都包含了按该qp值压缩的全部label文件。

注意:以上代码需要根据自己本地情况修改路径,并注意文件夹创建方式及命名方式!!!其实也可以添加一些代码自动创建文件夹,思路多多,自个儿觉得怎么方便怎么来~

更多FFmpeg的H.264编码可查阅这篇英文Guide,部分中文翻译可参看这篇博文;更多命令查看官方Documentation.

最新回复(0)