赞
踩
从官方文档可以看出,目前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
8-bit x264 的qp量化比例为0~51,10-bit x264的量化比例 为0~63,软件支持8-bit居多 。
qp越大,压缩越厉害,失真越严重,失去的信息越多,画面越模糊。
当前目录下有图像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图片对比:
有些朋友可能会在执行第一条命令的时候出现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处理。
对于一组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文件内就会生成对应的压缩编码结果。
视频与图像类似,参数一样,只是视频允许“一步到位”。假设当前目录下有MP4文件input.mp4
.
各配置选项,可以-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
两者都可。
视频原帧(上)和结果帧对比:
文件创建如下:
代码也很容易看懂。
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.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。