当前位置:   article > 正文

【FFmpeg命令】使用x264库进行图像视频(批量)压缩编码_ffmpeg -c:v libx264

ffmpeg -c:v libx264

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方式,可能的值有nonevarianceautovariance.

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

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
  • 1
  • 2

-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!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

原因可能在于输入图像的宽或高不符合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)
  • 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

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

3. 视频x264压缩编码

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

3.1 单命令

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

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

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

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

两者都可。

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

在这里插入图片描述
在这里插入图片描述

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/659950
推荐阅读
相关标签
  

闽ICP备14008679号